【微服务技术一】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做了负载均衡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/96668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CG MAGIC分享为什么使用3d Max渲染,呈现白蒙蒙的?

使用3d Max渲染&#xff0c;有小伙伴反映&#xff0c;为什么渲染过程中&#xff0c;max渲染&#xff0c;总是出现白蒙蒙的的效果呢&#xff1f; 渲染出这白白一片是什么原因导致的呢&#xff1f; 想要解决的朋友&#xff0c;点进来&#xff0c;看看CG MAGIC小编整理的解决方法…

208、仿真-51单片机脉搏心率与心电报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

学习笔记:Opencv实现图像特征提取算法SIFT

2023.8.19 为了在暑假内实现深度学习的进阶学习&#xff0c;特意学习一下传统算法&#xff0c;分享学习心得&#xff0c;记录学习日常 SIFT的百科&#xff1a; SIFT Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客…

python+django+mysql项目实践四(信息修改+用户登陆)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 用户信息修改 修改用户信息需要显示原内容,进行修改 通过url传递编号 urls views 修改内容需要用数据库的更新,用update进行更新,用filter进行选择 输入参数多nid,传递要修…

深度学习优化器

1、什么是优化器 优化器用来寻找模型的最优解。 2、常见优化器 2.1. 批量梯度下降法BGD(Batch Gradient Descent) 2.1.1、BGD表示 BGD 采用整个训练集的数据来计算 cost function 对参数的梯度&#xff1a; 假设要学习训练的模型参数为W&#xff0c;代价函数为J(W)&#xff0c;…

数组详解

1. 一维数组的创建和初始化 1.1 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组的大小 数组创建的实例&#xff1a; //代码1 int a…

OCT介绍和分类

前言&#xff1a;研究方向和OCT有关&#xff0c;为了方便以后回顾&#xff0c;所以整理了OCT相关的一些内容。 OCT介绍和分类 OCT介绍分类时域OCT频域OCT扫频OCT谱域OCT OCT介绍 名称&#xff1a;OCT、光学相干层析成像术、Optical Coherence Tomography。 概念&#xff1a;O…

CSS中的calc()函数有什么作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中的calc()函数及其作用⭐ 作用⭐ 示例1. 动态计算宽度&#xff1a;2. 响应式布局&#xff1a;3. 自适应字体大小&#xff1a;4. 计算间距&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点…

深度学习的“前世今生”

1、“感知机”的诞生 20世纪50年代&#xff0c;人工智能派生出了这样两个学派&#xff0c;分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy&#xff0c;后者则是由Frank Rosenblatt所领导。 “符号学派”的人相信对机器从头编程&#xff0c…

KeilMDk软仿真设置_STM32F03C8

1、KeilMDK软仿真的价值 (1)在没有硬件的情况下进行程序的编写调试。 (2)避免频繁的下载程序&#xff0c;延长单片机Flash寿命。 2、软仿真配置。 (1)打开Keil工程。 (2)点击“Options for Target ***”&#xff0c;如下图所示。 (3)点击“Debug”。 (4)进行如下配置。 U…

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)

前言&#xff1a; 在前面一篇文章云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初始安装&#xff08;一&#xff09;_华为cna_晚风_END的博客-CSDN博客 介绍了基于VMware虚拟机里嵌套部署华为云的云计算&#xff0c;不过仅仅是做到了在VRM的web界面添加计算节点…

Java入门必备|有你想知道的代码技巧

前言 本文主要分享记录学习Java时的敲代码大法&#xff0c;一步步与idea这个软件磨合&#xff0c;让它为我们敲代码这条路提供更便捷的帮助&#xff08;雀食好用哈&#xff09; 一.psvm 很多刚上手IJ软件&#xff0c;就被main()方法给折服了&#xff0c;这段代码量十分大 当…

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道&#xff0c;c是一个一本正经的编程语言&#xff0c;因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧&#xff01;&#xff01; 音乐的好处 提升情绪&#xff1a;音乐能够影响我们…

【小梦C嘎嘎——启航篇】vector 以及日常使用的接口介绍

【小梦C嘎嘎——启航篇】vector 日常使用的接口介绍&#x1f60e; 前言&#x1f64c;vector 是什么&#xff1f;vector 比较常使用的接口 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01…

SQL力扣练习(十一)

目录 1.树节点(608) 示例 1 解法一(case when) 解法二(not in) 2.判断三角形(610) 示例 1 解法一(case when) 解法二(if) 解法三(嵌套if) 3.只出现一次的最大数字(619) 示例 1 解法一(count limit) 解法二(max) 4.有趣的电影(620) 解法一 5.换座位(626) 示例 …

iOS申请证书(.p12)和描述文件(.mobileprovision)

打包app时&#xff0c;经常会用到ios证书&#xff0c;但很多人都苦于没有苹果电脑&#xff0c;即使有苹果电脑的&#xff0c;也会觉得苹果电脑操作也很麻烦&#xff0c;这里记录一下&#xff0c;用香蕉云编&#xff0c;申请证书及描述文件的过程。 香蕉云编的地址&#xff1a;…

C语言好题解析(三)

目录 选择题一选择题二选择题三选择题四编程题一编程题二 选择题一 以下程序段的输出结果是&#xff08;&#xff09;#include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }A: 12 B: 13 …

批量提取文件名到excel,详细的提取步骤

如何批量提取文件名到excel&#xff1f;我们的电脑中可能存储着数量非常多的电子文件&#xff0c;现在需要快速将这些文件的名称全部提取到Excel中。虽然少量数据可以通过复制粘贴的方式轻松完成&#xff0c;但是对于上万个数据而言&#xff0c;复制粘贴都是行不通的&#xff0…

Java泛型

什么是泛型 定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量(如: <E>)&#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 public class ArrayList<E>{ .... } 作用:泛型提供了在编译阶段约束所能操作的数据类型&#x…

数据结构:二叉树的递归实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、树的概念二、二叉树二叉树的概念二叉树的性质 三、二叉树链式结构实现二叉树节点定义创建二叉树节点遍历二叉树先序遍历二叉树(BinaryTreePrevOrder)中序遍历二叉树(BinaryTree…