当前位置: 首页 > news >正文

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

微服务技术一

    • 技术栈图
    • 一、注册中心Eureka
      • 概念:
      • 搭建EurekaServer
      • 服务注册
      • 服务发现(消费者对提供者的远程调用)
    • 二、Ribbon负载均衡
      • 负载均衡的原理:@LoadBalanced
      • 负载均衡的策略:IRule
      • 懒加载
    • 三、Nacos注册中心
      • Nacos的安装
      • 服务注册到Nacos
      • Nacos服务分级存储模型
        • 1、配置服务集群属性
        • 2、根据集群负载均衡(NacosRule)
        • 3、根据权重负载均衡
      • Nacos环境隔离 - namespace
        • 修改一个服务所处的空间
      • 临时实例与非临时实例
    • 四、Nacos配置管理
      • 统一配置管理
      • 配置热更新
      • 配置共享
      • 搭建Nacos集群

技术栈图

微服务完整的技术栈如图:在这里插入图片描述
技术栈学习:
在这里插入图片描述

一、注册中心Eureka

概念:

在Eureka架构中,微服务角色有两类EurekaServer:

  • 服务端,注册中心
    • 记录服务信息
    • 心跳监控
  • EurekaClient:客户端
    • Provider:服务提供者,例如案例中的user-service注册自己的信息到EurekaServer;每隔30秒向EurekaServer发送心跳
    • consumer:服务消费者,例如案例中的 order-service
      根据服务名称从EurekaServer拉取服务列表;基于服务列表做负载均衡,选中一个微服务后发起远程调用

什么是消费者提供者?

  • 消费者:调用其他服务
  • 提供者:被调

A调B,B调C,B是什么角色?

  • B的角色要看相对于谁而言

一个服务既可以是消费者又可以是提供者

在这里插入图片描述

搭建EurekaServer

  • 1、创建项目,引入 spring-cloud-starter-netflix-eureka-server 的依赖(版本依赖父工程的版本,所以没写)
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 2、编写启动类,添加 @EnableEurekaServer 注解

在这里插入图片描述

  • 3、添加application.yml文件,编写配置
server:port: 1111 # 自定义端口号
spring:application:name: eurekaserver  # eureka的服务名称
eureka:client:service-url: # eureka的地址信息defaultZone: http://localhost:1111/eureka

服务注册

  • 1、在需要注册的项目中引入 spring-cloud-starter-netflix-eureka-client 的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 2、在application.yml文件,编写配置
spring:application:name: xxxservice # 服务的名称
eureka: client:service-url:defaultZone: http://localhost:1111/eureka

下图是注册了两个服务,可以看到两个客户端的服务和eureka的服务都存在。
在这里插入图片描述
一个服务注册两个实例:
在这里插入图片描述

服务发现(消费者对提供者的远程调用)

【服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡】

  • 1、修改服务的代码,修改访问的路径,用服务名代替ip、端口。下图是之前的路径写法。
    在这里插入图片描述
    修改为:
    String url = "http://xxxservice/user/" + …… ;
    
  • 2、在yyy-service项目组的启动类中的RestTemplate添加负载均衡的注解
@Bean
@LoadBalanced  //负载均衡的注解,因为上面我们对xxxservice服务创建了两个实例
public RestTemplate restTemplate() {return new RestTemplate();
}

二、Ribbon负载均衡

在这里插入图片描述

负载均衡的原理:@LoadBalanced

@LoadBalanced源码分析取到的负载地址:

  • LoadBalancerInterceptor.java
    在这里插入图片描述
  • 继续 loadBalancer.execute ,进入RibbonLoadBalancerClient.java
    在这里插入图片描述
  • 在其内部方法中,会有IRule 规则接口,有轮询,随机等负载规则
    在这里插入图片描述

总结如图:
在这里插入图片描述

负载均衡的策略:IRule

上面提到IRule接口,这里做一个简单介绍,理解一下负载规则的继承关系
在这里插入图片描述
在这里插入图片描述
可以通过定义IRule实现修改负载均衡规则,有两种方式:

  • 1、代码方式:在消费者的启动类中,定义一个戏得IRule:

    @Bean
    public IRule randomRule() {return new RandomRule();
    }
    
  • 2、配置文件方式:在消费者的application.yml文件中,添加新的配置也可以修改规则:

    xxxservice:  # 先指定提供者服务名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
    

注意:
两种方法的作用范围是不一样的,第一种消费者所调的全体服务都是这种规则;第二种指定了提供者的服务名,是有所指的。

懒加载

Ribbon默认是采用懒加载,及第一次访问时才会五去创建LoadBalanceClient ,请求时间过长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时。
配置开启饥饿加载:

ribbon:eager-load:enabled: true # 开启饥饿加载clients: xxxservice # 指定对xxxservice 这一个服务饥饿加载
ribbon:eager-load:enabled: true # 开启饥饿加载clients: # 多个服务- xxxservice- zzzservice

三、Nacos注册中心

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相比Eureka功能更加丰富。

Nacos的安装

安装包:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases

windows的安装与启动很简单,可以参考自己搜索资料进行
就说一下启动的两种方式:

  • 1
    文件解压后有bin目录,中的startup.cmd双击就可以启动
  • 2
    bin目录下打开cmd,输入启动命令 startup.cmd -m standalone

启动成功,会有带nacos的banner与网址和completed的显示信息。

在这里插入图片描述
http://192.168.150.1:8848/nacos/index.html 会有浏览器窗口,默认账号密码都是nacos

服务注册到Nacos

  • 1、在父工程中添加spring-cloud-alibaba的管理依赖:
<dependeny><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependeny>
  • 2、提醒:eureka的依赖配置要删掉
  • 3、添加nacos的客户端依赖:
<dependeny><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependeny>
  • 4、修改消费者与提供者服务中application.yml文件,添加nacos地址:
spring:cloud:nacos:server-addr: localhost:8848 # nacos的服务地址(默认就是8848)
  • 5、打开nacos的服务管理列表可以看到服务已经注册到nacos中。点开 “详情” 可以看到该服务的一些信息
    在这里插入图片描述

Nacos服务分级存储模型

一级是服务,例如userservice
二级是集群,例如杭州或上海
三级是实例,例如杭州机房的某台部署了xxxservice的服务器

1、配置服务集群属性

  • 1、修改application.yml,添加配置内容:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ # 配置集群名称,即机房位置,例如:HZ,杭州

这是将提供者配置了集群属性(消费者配置同上),当消费者调用时,由于负载均衡的影响,会进行轮询的规则,找到与自己同集群服务优先使用,就要进行负载均衡的修改:

2、根据集群负载均衡(NacosRule)

  • 1、修改yyyservice(消费者)中的application.yml,设置集群位HZ
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ
  • 2、然后在yyy-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:
yyyservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
  • 3、注意将xxx-service的权重都设置为1 (在Nacos的控制台可以设置实例的权重值)

NacosRule负载均衡策略:
1、优先选择同集群服务实例
2、本地集群找不到提供者,才去其它集群寻找,并且会报警告
3、确定了可用实例列表后,在采用随机负载均衡挑选实例

3、根据权重负载均衡

  • 1、在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮
  • 2、将权重设置,会发现小于1的权重被访问到的频率大大降低
    在这里插入图片描述

实例的权重控制:
1、Nacos控制台可以设置实例的权重值,在0~1之间
2、同集群内的多个实例,权重越高被访问的频率越高
3、权重设置为0则完全不会被访问

Nacos环境隔离 - namespace

Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。

nacos默认有一个“public (保留空间)”。
新建命名空间的时候,命名空间ID可以不填,会随机生成。
不同namespace下的服务是不可见的

修改一个服务所处的空间

在服务的application.yml,添加namespace:

spring: cloud:nacos:server-addr: localhost:8848discovery:cluster-name: SH # 上海namespace: xxxxxxxxxxxxxxxx # 命名空间ID

临时实例与非临时实例

服务注册到Nacos时,可以选择注册为临时实例或非临时实例:

spring:cloud:nacos:discovery:ephemeral: false # 设置非临时实例,默认是true临时

在这里插入图片描述
【主动检测对服务的压力比较大,所以一般推荐临时实例】

四、Nacos配置管理

统一配置管理

  • 1、在Nacos中添加配置文件
    在这里插入图片描述
  • Data-ID:相当于配置文件名,一般不要定义为application.yml,可以使用 “服务名-环境.yaml” 。
  • Group:分组不动就可
  • 描述:就是描述
  • 配置格式:选择 YAML
  • 配置内容:做热更新的配置
    在这里插入图片描述

在这里插入图片描述

  • 2、在某个服务的pom中引入Nacos的配置管理客户依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 3、在服务中的resource目录添加一个 bootstrap.yml 文件,这个文件是引导文件优先级高于application.yml:
    配置nacos地址、当前环境、服务名称、文件后缀名,决定了程序启动时去nacos读取哪个文件。
spring:application:name: xxxservice # 服务名称profiles:active: dev # 开发环境,此处是devcloud:nacos:server-addr: localhost:8848 # nacos地址config: file-extension: yaml # 文件名后缀
  • 注意:在原本的application.yml中关于服务名称和nacos服务的配置删掉

配置热更新

热更新:服务的配置修改,且修改后不需要重启服务,配置就能生效。

  • 方式一:在@Value注入的变量所在类上(Controller) 添加注解@RefreshScope

在这里插入图片描述

  • 方式二:使用@ConfigurationProperties注解,自动刷新

在这里插入图片描述

【前缀名与变量名两者拼接与配置文件一致,就能完成属性的自动配置】

配置共享

微服务启动时会从nacos读取多个配置文件:

  • [spring.application.name]-[spring-profiles.active].yaml,例如:xxxservice-dev.yml
  • [spring-application.name].yaml,例如userservice.yml

无论profile如何变化,[spring-application.name].yaml文件一定会加载,因此多环境贡献配置可以写入这个文件。
【详细建议主攻一下这个环境共享】
在这里插入图片描述

搭建Nacos集群

在这里插入图片描述

搭建集群的基本步骤:

  • 搭建数据库,初始化数据表结构
  • 下载nacos安装包
  • 配置nacos
  • 启动nacos集群
  • nginx反向代理

配置集群nacos:

  • 进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf
  • 配IP
    在这里插入图片描述
  • 修改application.properties文件,添加数据库配置
    在这里插入图片描述
  • 配置完成后复制三份模拟,将三个nacos的端口改为不一样的
  • 启动nacos,在bin目录下的命令是startup

nginx的反向代理:

  • 修改conf/nginx.conf文件,配置 在这里插入图片描述
  • 此时访问nacos的路径为:localhost/nacos 即可进入nacos的网址,虽然只有一个网址,由于nginx的存在nacos做了负载均衡

相关文章:

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

微服务技术一 技术栈图一、注册中心Eureka概念&#xff1a;搭建EurekaServer服务注册服务发现&#xff08;消费者对提供者的远程调用&#xff09; 二、Ribbon负载均衡负载均衡的原理&#xff1a;LoadBalanced负载均衡的策略&#xff1a;IRule懒加载 三、Nacos注册中心Nacos的安…...

【Linux】可重入函数 volatile关键字 以及SIGCHLD信号

可重入函数 volatile关键字 以及SIGCHLD信号 一、可重入函数1、引入2、可重入函数的判断 二、volatile关键字1、引入2、关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 1、引入 我们来先看一个例子来帮助我们理解什么是可重入函数&#xff1a; 假设我们现在要对…...

【动态规划】回文串问题

文章目录 动态规划&#xff08;回文串问题&#xff09;1. 回文子串2. 最长回文子串3. 回文串分割 IV4. 分割回文串 ||5. 最长回文子序列6. 让字符串成为回文串的最小插入次数 动态规划&#xff08;回文串问题&#xff09; 1. 回文子串 题目链接 状态表示 f[i][j]表示 i 到 j …...

Laravel Swift Mail发送带附件的邮件报错 “Swift_IoException The path cannot be empty“处理

先说下情况&#xff0c;就是我要做一个发送附件的邮件发送功能&#xff0c;结果&#xff0c;报错&#xff1a;The path cannot be empty。给我整的有点迷糊&#xff0c;网上也没有类似的问题。后来&#xff0c;我检查了一下代码&#xff0c;发现有个地方&#xff0c;是需要给附…...

Linux下常见的代理服务器软件介绍

在Linux系统中&#xff0c;代理服务器是我们搭建网络环境和处理网络请求的常用工具。但是&#xff0c;你知道Linux下常见的代理服务器软件有哪些吗&#xff1f;本文将为你带来对几款常见的Linux代理服务器软件的介绍&#xff0c;帮助你选择适合的代理服务器。 一、Squid&#…...

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…...

alertmanager创建nginx-ingress basic auth鉴权

步骤 生成密码 printf "admin:$(openssl passwd -crypt xxxxxx)\n" >> auth 创建新的 Kubernetes 密钥 kubectl create secret generic basic-auth --from-file auth -n victoria-metrics 修改 ingress 以使用 secret 中的凭证来实现基本身份验证 编辑 P…...

系列六、Redis中的五大数据类型及相关操作

一、五大数据类型 String类型、List类型、Set类型、ZSet类型、hash类型。 二、String类型 2.1、内存储存模型 2.2、常用操作命令 三、List类型 3.1、概述 list列表&#xff0c;相当于Java中的list集合。特点&#xff1a;元素有序 且 可以重复。 3.2、内存存储模型 3.3、常用…...

四大运营商的大流量卡测评,看完您会选哪个运营商?

很多朋友都说网上的流量卡资费是真的便宜&#xff0c;但是小编认为资费便宜归便宜&#xff0c;但是运营商的小心思也有不少。 ​ 今天小编就带大家看一看三大运营商推出的正规流量卡都有哪些小心思&#xff1f; 首先&#xff0c;移动推出的线上大流量卡数量是最少的&#xff…...

Apache-Maven

安装Maven 解压apache-maven到目录下 Maven目录如下 bin&#xff1a;目录中存放的是可执行文件&#xff0c;JAVA项目中的编译执行打包都要使用bin. conf:存放的是Maven的配置文件&#xff0c;本地配置、私服配置都需要在conf下的settings.xml进行配置。 lib下存放的是Maven所…...

什么是原子交换?

安全地在各个区块链网络之间传输资产对于释放被困流动性并吸引更多用户进入这一领域至关重要&#xff0c;同时也保持 Web3 的信任最小化核心价值。原子交换是一种让两个人在不依赖于中介来促成交易的情况下&#xff0c;在不同的区块链网络之间交换通证资产的方式。这为 DeFi 用…...

java springboot word文档转pdf

java springboot word文档转pdf 1、环境2、依赖3、代码 1、环境 1、java、springboot 2、maven或者gradle 3、办公软件&#xff08;自己电脑上的wps或者office等&#xff0c;如果部署到服务器上也要安装&#xff0c;linux、Mac 都有&#xff0c;自己安装&#xff09; 可能会遇…...

【Leetcode Sheet】Weekly Practice 2

Leetcode Test 1281 整数的各位积和之差(8.9) 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 提示&#xff1a; 1 < n < 10^5 【原始代码】&#xff1a; int subtractProductAndSum(int n){//1 < n < 10^5//…...

【BERTopic应用 03/3】:微调参数

一、说明 一般来说&#xff0c;BERTopic 在开箱即用的模型中工作得很好。但是&#xff0c;当您有数百万个数据要处理时&#xff0c;使用基本模型处理数据可能需要一些时间。在这篇文章中&#xff0c;我将向您展示如何微调BERTopic中的一些参数并比较它们的结果。让我们潜入。 二…...

2023年上半年数学建模竞赛题目汇总与难度分析

2023年上半年数学建模竞赛题目汇总与难度分析 ​由于近年来国赛ABC题出题方式漂浮不定&#xff0c;没有太大的定性&#xff0c;目前总体的命题方向为&#xff0c;由之前的单一模型问题变为数据分析评价优化或者预测类题目是B、C题的主要命题方向。为了更好地把握今年命题的主方…...

Linux下搭建java环境

文章目录 一&#xff0c;xshell链接linux二&#xff0c;linux安装jdk环境 一&#xff0c;xshell链接linux 这里用到的工具,VMware搭配CentOS7 64位Xshell5 操作之前确保,传输Xshell连接了虚拟机 打开Xshell,文件->新建 主机ip—>进入虚拟机,右键打开终端,输入命令:ifco…...

String、StringBuffer、StringBuilder三者的异同?

String字符串 不可变的字符序列在 jdk1.8&#xff0c;我们底层用 char [ ] 存储在 jdk 17&#xff0c;我们底层用 byte [ ] 存储 StringBuffer字符串缓冲区类 可变的字符序列&#xff0c;线程安全的&#xff08;synchronized&#xff09;&#xff0c;效率低在 jdk1.8&#xf…...

htmlCSS-----弹性布局案例展示

目录 前言 效果展示 ​编辑 代码 思路分析 前言 上一期我们学习了弹性布局&#xff0c;那么这一期我们用弹性布局来写一个小案例&#xff0c;下面看代码&#xff08;上一期链接html&CSS-----弹性布局_灰勒塔德的博客-CSDN博客&#xff09; 效果展示 代码 html代码&am…...

Fiddler模拟请求发送和修改响应数据

fiddler模拟伪造请求 方法一&#xff1a;打断点模拟HTTP请求 1、浏览器页面填好内容后&#xff08;不要操作提交&#xff09;&#xff0c;打开fiddler&#xff0c;设置请求前断点&#xff0c;点击菜单fiddler,”Rules”\”Automatic Breakpoints”\”Before Requests” 2、在…...

RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入

配置DID 一、Developer中创建SWC1.1 创建Application Component Type1.2 实例化Component二、在SWC中创建接口以及Runnable2.1 创建DID的Service Ports2.2 创建DID的Service Runnable三、在Configurator连接接口以及生成代码3.1 连接DCM与SWC3.2 生成RTE3.3 生成SWC的DID的模板…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...