Eureka和Nacos

本文详细介绍了微服务架构,比较了Dubbo和SpringCloud在微服务技术上的优劣,以及SpringCloud在服务拆分、远程调用、Eureka注册中心、负载均衡等方面的应用,包括Nacos的介绍和与Eureka的区别。
摘要由CSDN通过智能技术生成

SpringCloud

1.认识微服务

1.1微服务架构

  • 单体架构:将业务的所有功能都集中在一个项目中开发,打成一个包部署

优点:

  • 架构简单
  • 部署成本低

缺点:

  • 耦合度高
  • 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务

优点:

  • 降低服务耦合
  • 有利于服务升级拓展

缺点

  • 架构非常复杂,运维,监控,部署难度提高

微服务就是一种经过良好架构设计的分布式架构方案,微服务架构特征:

  • 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
  • 面向服务:微服务对外暴露业务接口
  • 自治:团队独立、技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXXavAbN-1692945392550)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824172255270.png)]

微服务结构

在国内最知名的就是SpringCloud和阿里巴巴的Dubbo

1.2微服务技术对比

DubboSpringCloudSpringCloudAlibaba
注册中心zookeeperEureka,ConsulNacos,Eureka
服务远程调用Dubbo协议Feign(http协议)Dubbo,Feign
配置中心SpringCloudConfigSpringCloudConfig,Nacos
服务网关SpringCloudGateway,ZuulSpringCloudGateway,Zuul
服务监控和保护dubbo-admin,功能弱HystrixSentinel

1.3SpringCloud

  • SpringCloud是目前国内使用最广泛的微服务框架,官网地址:https://spring.io/projects/spring-cloud
  • SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ixtm9ICr-1692945392551)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824174727326.png)]

2.服务器拆分及远程调用

2.1服务拆分注意事项

1.不同微服务,不要重复开发相同业务

2.微服务数据独立,不要访问其他微服务的数据库

3.微服务可以将自己的业务暴露为接口,供其他微服务调用

2.2根据订单id查询订单功能

需求分析:根据id查询订单的同时,把订单所属的用户信息一起返回

2.3远程调用方式分析

使用RestTemplate方法发送请求

1.在启动类中注入RestTemplate

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    /**
     * 创建RestTemplate并注入
     * @return
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2.修改方法

    @Autowired
    RestTemplate restTemplate;
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //利用RestTemplate发起http请求,查询用户
        //url路径
        String url = "http://localhost:8081/user/" + order.getUserId();
        //发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        //封装user到order
        order.setUser(user);
        // 4.返回
        return order;
    }

2.4提供者与消费者

  • 服务提供者:一次业务中,被其他微服务调用的服务(提供接口给其他的服务)
  • 服务消费者:一次业务中,调用其他微服务的服务(调用其他服务提供的接口)
  • 服务A调用了服务B,服务B又调用了服务C,那么服务B是什么角色?
  • 角色是相对的,要结合具体业务来谈,业务不同,角色是会变化的,任何一个服务既可以是消费者又可以是提供者

3.Eureka注册中心

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ozLoDmXS-1692945392552)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824191122004.png)]

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uy9TgBLn-1692945392552)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824191224992.png)]

3.1Eureka的作用

1.消费者该如何获取服务器提供者具体信息?

  • 服务提供者启动时像eureka注册自己的信息
  • eureka保存这些信息
  • 消费者根据服务名称向eureka拉取提供者信息

2.如果有多个服务器提供者,消费者该如何选择?

  • 服务消费者利用负载均衡算法,从服务列表中选一个

3.消费者也如何感知提供者健康状态?

  • 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
  • eureka会更新记录服务列表信息,心跳不正常会被剔除
  • 消费者就可以拉取到最新的信息

3.2EurekaServer的搭建

1.创建项目,引入spring-boot-netflix-eureka-server依赖

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

2.编写启动类,添加EnableEurekaServer注解

@EnableEurekaServer//eureka自动装配开关
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

3.添加applica.yml文件,编写配置

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

4.启动服务,打开10086端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XWfWSt3y-1692945392552)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824202138787.png)]

3.3Eureka服务注册

注册user-service

  • 引入eureka客户端依赖
        <!--引入eureka客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  • 编写yml配置文件
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: eurekaserver #配置服务名称
mybatis:
  type-aliases-package: cn.itcast.user.pojo
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
eureka:
  client:
    service-url:   #eureka地址信息
      defaultZone: http://127.0.0.1:10086/eureka
  • 启动三个服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rml5EAJy-1692945392552)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824203401637.png)]

可以看到,三个服务器全部加入成功

3.4服务拉取

在order-service完成服务拉取

  • 修改OrderService的代码,修改访问的url路径,用服务名代替ip和端口
String url = "http://userservice/user/" + order.getUserId();
  • 在order-service项目的启动类中的RestTemplate添加负载均衡注解
    @Bean
    @LoadBalanced//负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

4.Ribbon负载均衡

上一节中,我们添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢?

4.1负载均衡原理

SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kBO2hi3l-1692945392553)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824205237175.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z0rd4sN4-1692945392553)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230824210200082.png)]

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

4.2负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54F6Cqql-1692945392554)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825090748938.png)]

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

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

4.3自定义负载均衡策略

  • 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule(全局配置)
    //自定义负载均衡规则,改成随机
    @Bean
    public IRule randomRule() {
        return new RandomRule();
    }
  • 配置文件方式:在order-service的application.yml中编写配置文件(针对某个微服务的配置)
userserver: # 给某个微服务配置负载均衡规则
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则

4.4饥饿加载

ribbon:  
  eager-load:
    enabled: true #饥饿加载开启
    clients: #指定分页加载的服务名称(集合)
      -userserve

5.Nacos注册中心

国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。

5.1.认识和安装Nacos

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

  • 安装

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

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

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

  • 解压
  • 配置端口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2BnYBgz-1692945392554)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825102047978.png)]

修改server.port=8848

  • 启动
startup.cmd -m standalone

访问

在浏览器输入地址:http://127.0.0.1:8848/nacos即可:

5.2服务注册到nacos

  • 引入alibaba管理依赖和nacos依赖

在父工程引入阿里巴巴管理依赖

把erueka依赖注释掉

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

在子工程中引入nacos依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 在application.yml文件中配置nacos相关配置
spring:
  cloud:
    nacos:
      server-addr: localhost:8848

5.3Nacos服务分级存储模型

给userserver配置集群

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

重启两个user-server实例后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QFxrYEu3-1692945392554)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825125438147.png)]

修改负载均衡规则

修改order-server的appl.yml文件,修改负载均衡规则

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

1.优先选择同集群服务实例列表

2.本地集群找不到提供者,才会去其他集群寻找,并且会报警告

3.确定了可用实例列表后,再采用随机负载均衡挑选实例

5.4修改集群权重

实际部署中会出现这样的场景:

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。

但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。

因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。

在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ih0w4ZBl-1692945392555)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825133541516.png)]

根据权重大小来分配用户请求,权重越高,分配越多,当权重为0时,不会被访问

5.5隔离环境

namesapce

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuyz0kSV-1692945392555)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825140222732.png)]

新建命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5ys0ybo-1692945392555)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825141124233.png)]

修改order-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
    	namespace: 538c27b9-5c5a-49eb-a855-314393a1e743 #dev环境命名空间

6.Nacos和Eureka的区别

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

  • 临时实例:如果实例宕机超过一段时间,会从服务列表剔除,默认的类型
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例

配置一个永久实例:

在application.yml中修改配置

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvDrEshz-1692945392556)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825142733255.png)]

Nacos和Eureka整体结构类似,服务注册,服务拉取,心跳等待,但是也存在一些差异:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LSdgsLOT-1692945392556)(C:\Users\19627\AppData\Roaming\Typora\typora-user-images\image-20230825142956940.png)]

  • Nacos和Eureka的共同点
    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Naocs与Eureka的区别
    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例

配置一个永久实例:

在application.yml中修改配置

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

[外链图片转存中…(img-WvDrEshz-1692945392556)]

Nacos和Eureka整体结构类似,服务注册,服务拉取,心跳等待,但是也存在一些差异:

[外链图片转存中…(img-LSdgsLOT-1692945392556)]

  • Nacos和Eureka的共同点
    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Naocs与Eureka的区别
    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值