注册中心Eureka和Nacos,以及负载均衡Ribbon

news2024/11/18 7:37:28

1.初识微服务

1.1.什么是微服务

微服务,就是把服务拆分成为若干个服务,降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

在这里插入图片描述

1.2.单体架构和微服务架构的区别:

  • 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统

  • 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

  • 微服务:一种良好的分布式架构方案

    ①优点:拆分粒度更小、服务更独立、耦合度更低

    ②缺点:架构非常复杂,运维、监控、部署难度提高

  • SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

1.3.什么是SpringCloud

SpringCloud是一种微服务框架,集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

在这里插入图片描述
在这里插入图片描述

1.4.微服务技术对比

在这里插入图片描述

在这里插入图片描述

2.Eureka注册中心

如果没有Eureka,就要把服务调用代码写死,下面是例子

//配置类注册restTemplate的bean
@Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
@Autowired
private RestTemplate restTemplate;
String url = "http://localhost:8081/user/"+order.getUserId();
User user = restTemplate.getForObject(url,User.class);
order.setUser(user);

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

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

2.1.Eureka作用

在这里插入图片描述

  • 消费者如何获取服务提供者具体信息?
    • 提供者启动时向eureka注册自己的信息
    • eureka保存这些信息
    • 消费者根据服务名称向eureka获取提供者信息
  • 如果有多个服务提供者,消费者利用负载均衡算法,从服务器列表挑选一个
  • 消费者如何感知服务提供者健康状态?
    • 提供者每30s想EurekaServer发送心跳请求,报告健康状态
    • eureka会更新记录服务器列表信息,不健康的会被删除
    • 消费者就可以拉取到最新信息

2.2.搭建Eureak服务

流程:搭建注册中心 --> 服务注册 --> 服务发现

2.2.1.搭建Eureka服务

1.引入依赖,服务器依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.加注解@EnableEurekaServer,表示启用Eureka服务

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

3.编写配置文件application.yml,把eureka注册为服务

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

2.3.2.服务注册

1.引入依赖,客户端依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.注册服务,配置eureka地址

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

2.3.3.服务发现(服务拉取)

1.添加依赖(消费者也要添加客户端依赖)
2.配置文件(消费者也要添加到服务)
3.修改url路径(服务拉取)

String url = "http://user-service/user/"+order.getUserId();
        User user = restTemplate.getForObject(url,User.class);
        order.setUser(user);

4.负载均衡@LoadBalanced

    //配置类注册restTemplate的bean
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

2.3.Eureka和Ribbon

Eureka是一个服务注册和发现的组件,Ribbon是一个负载均衡的组件。
在这里插入图片描述

负载均衡流程

在这里插入图片描述

2.3.1.Ribbon负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:
在这里插入图片描述
不同规则的含义如下:

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

2.3.2.Ribbon负载均衡配置

两种方式的区别:

  • 代码方式:全局配置,所有order的服务者都是这个配置,
  • 配置文件方式:给某个微服务配置负载均衡规则,比如只配置userservice服务
  1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意,一般用默认的负载均衡规则,不做修改。

2.3.3.饥饿加载

默认是懒加载:第一次使用才加载LoadBalanceClient
饥饿加载:启动即加载

ribbon:
  eager-load:
    clients: 
    - user-service   # 指定饥饿加载的服务名称,多个就换行加 -
    enabled: true  # 开启饥饿加载

3.Nacos注册中心

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

3.1.服务注册到nacos

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

下载解压到无中文无空格的目录下,
启动:cmd命令

startup.cmd -m standalone

1.引入依赖

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:不要忘了注释掉eureka的依赖。

2.配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

注意:不要忘了注释掉eureka的地址

3.2.服务分级存储模型

一个服务有多个实例,同一个机房内的实例,划分为一个集群
在这里插入图片描述
一级:集群
二级:服务
三级:实例

3.2.1.配置集群

方法一:
修改user-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

修改一个集群,启动对应实例,再修改集群,再启动实例,即可实现集群划分配置。

方法二:
也可以修改服务的VM选项
-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH
在这里插入图片描述

3.2.2.配置同集群优先的负载均衡

1.给消费者添加集群

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名称

2.在消费者yml文件中修改负载均衡规则

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 

3.3.配置权重

  • 权重在可以设置在0~1之间
  • 权重越高,被访问的越多
  • 权重为零,不会被访问

3.4.环境隔离

Nacos提供了namespace来实现环境隔离功能。例如开发环境和生产环境隔离

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
  • 每个namespace有唯一的id

在这里插入图片描述
在yml文件中,添加namespace的id

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

3.5.Eureka和nacos的区别

在这里插入图片描述

  • Nacos与eureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP(强调服务可用性)方式,当集群中存在非临时实例时,采用CP(强调数据可靠性和一致性)模式;Eureka采用AP方式

Nacos的服务实例分为两种l类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。

  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
    配置一个实例为永久实例,yml文件添加以下配置

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【干货】通过Bootstrap框架添加下拉框到导航栏

最终效果展示详细步骤及代码1、获取相关代码2、引入CSS和JavaScript文件3、全部代码 最终效果展示 详细步骤及代码 1、获取相关代码 https://v3.bootcss.com/components/#navbar-default 本文用到代码为 <nav class"navbar navbar-default"><div class&…

第六阶|见道明心的笔墨(上)从书法之美到生活之美——林曦老师的线上直播书法课

如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程 如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程

零售行业供应链管理核心KPI指标(二) – 线上订单履行周期

一般品牌零售商有一个大的渠道就是全国连锁的商超、大卖场&#xff0c;非常重要的渠道&#xff0c;要去铺货。同类型的产品都在竞争这个大渠道&#xff0c;但商超、大卖场在这类产品的容量是有限的&#xff0c;所以各个品牌就要去争夺整个容量&#xff0c;看谁在有限的容量里占…

最小二乘线性拟合FC(SCL计算源代码)

采用PLC等微控制器采集一些线性传感器数据时&#xff0c;如果已知线性关系&#xff0c;我们可以利用直线方程求解。具体的算法公式和讲解大家可以查看下面相关文章&#xff1a; PLC模拟量采集算法数学基础&#xff08;线性传感器&#xff09;_plc3秒采集一次模拟量_RXXW_Dor的…

expert systems with applications latex使用、投稿、合集(超详细)

目录 一、main.tex 1、框架 2、图片 3、表格 4、公式 5、文献引用 6、引用文献高亮 及 其他需要导入的包 7、特殊符号 比如 ✔ ∈ 二、投稿 1、orcid 身份码 2、.bib 文件设置为 manuscript 3、Cover Letter 4、declaration of interest statement 5、模板及其…

分享一个恒流源和恒压源电路,可实现恒压、恒流充放电

通过控制输出DA-IOUT1,DA-VOUT1电流和电压DA的大小&#xff0c;及继电器控制和CH1I,CH1V的采用反馈&#xff0c;该电路可实现&#xff0c;恒流充电&#xff0c;恒压充电&#xff0c;恒流恒压充电&#xff0c;恒流放电&#xff0c;恒阻充电&#xff0c;恒功率充电等充放电模式&a…

01_YS_LED_USART1_KEY_Test_Demo

1.硬件设计参考图 参考&#xff1a;00_YS_硬件电路图_往事不可追_来日不方长的博客-CSDN博客 2.配置LED 2.1代码部分 代码初始化部分如下图MX自动生成&#xff1a; // main.h 中/* Private defines -----------------------------------------------------------*/ #define…

Wordcloud | 风中有朵雨做的‘词云‘哦!~

1写在前面 今天可算把key搞好了&#xff0c;不得不说&#x1f3e5;里手握生杀大权的人&#xff0c;都在自己的能力范围内尽可能的难为你。&#x1f602; 我等小大夫也是很无奈&#xff0c;毕竟奔波霸、霸波奔是要去抓唐僧的。 &#x1f910; 好吧&#xff0c;今天是词云&#x…

Vue3 Router路由单页面跳转简单应用

去官网学习→介绍 | Vue Router cd 到项目 安装 Router &#xff1a; cnpm install --save vue-router 或着 创建项目时勾选Router vue create vue-demo <i> to invert selection, and <enter> to proceed)(*) Babel( ) TypeScript(*) Progressive Web …

《vue3实战》运用radio单选按钮或Checkbox复选框实现单选多选的试卷制作

文章目录 目录 系列文章目录 1.《Vue3实战》使用axios获取文件数据以及走马灯Element plus的运用 2.《Vue3实战》用路由实现跳转登录、退出登录以及路由全局守护 3.《vue3实战》运用Checkbox复选框实现单选多选的试卷展现&#xff08;本文&#xff09; 文章目录 前言 radio是什…

【探索Linux】—— 强大的命令行工具 P.3(Linux开发工具 vim)

阅读导航 前言vim简介概念特点 vim的相关指令vim命令模式(Normal mode)相关指令插入模式(Insert mode)相关指令末行模式(last line mode)相关指令 简单vim配置&#xff08;附配置链接&#xff09;温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&…

observer与qt信号槽的区别

observer类图(应用) 定义/区别/注意事项 点击截图后可放大显示,也可图片另存为&#xff0c;这个技术讨论是来接受批评的。 参考&#xff1a;

专访 BlockPI:共建账户抽象未来的新一代 RPC 基础设施

在传统 RPC 服务板块上&#xff0c;开发者一直饱受故障风险、运行环境混乱等难题的折磨。实现 RPC 服务的去中心化&#xff0c;且保持成本优势和可扩展性&#xff0c;始终是区块链基础设施建设的重要命题之一。从 2018 年观察中心化 RPC 供应商服务现状开始&#xff0c;BlockPI…

设计模式之构建器(Builder)C++实现

构建器提出 在软件功能开发中&#xff0c;有时面临“一个复杂对象”的创建工作&#xff0c;该对象的每个功能接口由于需求的变化&#xff0c;会使每个功能接口发生变化&#xff0c;但是该对象使用每个功能实现一个接口的流程是稳定的。构建器就是解决该类现象的。构建就是定义…

C语言好题解析(一)

目录 选择题1选择题2选择题3选择题4编程题一 选择题1 执行下面程序&#xff0c;正确的输出是&#xff08; &#xff09;int x 5, y 7; void swap() {int z;z x;x y;y z; } int main() {int x 3, y 8;swap();printf("%d,%d\n",x, y);return 0; }A: 5,7 B: …

CSRF

CSRF CSRF&#xff0c;跨站域请求伪造&#xff0c;通常攻击者会伪造一个场景&#xff08;例如一条链接&#xff09;&#xff0c;来诱使用户点击&#xff0c;用户一旦点击&#xff0c;黑客的攻击目的也就达到了&#xff0c;他可以盗用你的身份&#xff0c;以你的名义发送恶意请…

基于深度学习的指针式仪表倾斜校正方法——论文解读

中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目&#xff1a;Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724…

web前端开发基础入门html5+css3+js学习笔记(一)

目录 1.第一个前端程序2.前端工具的选择与安装3.VSCode开发者工具快捷键4.HTML5简介与基础骨架4.1 HTML5的DOCTYPE声明4.2 HTML5基本骨架4.2.1 html标签4.2.2 head标签4.2.3 body标签4.2.4 title标签4.2.5 meta标签 5.标签之标题5.1 快捷键5.1 标题标签位置摆放 6.标签之段落、…

商城系统搭建,选择SaaS模式还是源码模式?

当今互联网时代&#xff0c;电子商务已成为商业发展的重要方向之一。搭建一个高效、可靠的商城系统是企业成功的关键之一。然而&#xff0c;在选择商城系统时&#xff0c;很多企业面临一个重要的决策&#xff1a;是选择SaaS&#xff08;软件即服务&#xff09;模式还是购买源码…

无涯教程-Perl - symlink函数

描述 此函数在OLDFILE和NEWFILE之间创建符号链接。在不支持符号链接的系统上,会导致致命错误。 语法 以下是此函数的简单语法- symlink ( OLDFILE, NEWFILE )返回值 如果失败,此函数返回0,如果成功,则返回1。 例 以下是显示其基本用法的示例代码,首先在/tmp目录中创建一…