0


微服务(Eureka Nacos Feign Gateway)入门

介绍:

Eureka和Nacos都是服务发现和配置管理的解决方案,它们有一些共同点,也有一些不同之处。

共同点:

  1. 都支持服务注册和服务拉取:Eureka和Nacos都支持服务提供者将自己的服务信息注册到注册中心,服务消费者可以从注册中心拉取服务信息。
  2. 都支持服务提供者心跳方式做健康检测:Eureka和Nacos都会定期检测服务提供者的健康状态,以确保服务可用。

不同点:

  1. 心跳检测机制:Eureka对服务提供者是每30秒一次心跳检测来检测服务健康,而Nacos则把服务分为临时服务和非临时服务,对于临时服务,Nacos采取策略与Eureka相同,对于非临时服务,Nacos不会对其进行心跳检测,而是会主动调用该服务查看是否正常,若不正常会把该服务标记为不健康,但不会把该服务从服务列表中去掉。
  2. 数据推送方式:Eureka会定时向注册中心拉取服务,如果不主动拉取服务,注册中心不会主动推送。而Nacos中注册中心会定时向消费者主动推送信息,这样就会保持数据的准时性。
  3. 集群模式:Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;而Eureka采用AP方式。
  4. 功能丰富度:Nacos除了提供服务注册与发现外,还涵盖了动态配置管理、服务健康监测等多方面功能,而Eureka则主要关注服务注册和发现,不包含动态配置管理功能。

一 Eureka搭建流程

1.搭建注册中心

 1.1创建注册中心模块并导入Eureka服务依赖(基于spring-boot构建微服务项目),父模块导入spring-cloud相关依赖
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

1.2在启动类上添加注解开启Eureka服务

package cn.itcast.eureka;

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

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

1.3创建application.yml文件并配置相关配置信息

server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称

eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

eureka本身也是一个服务,也需要配置注册信息

2 Eureka客户端搭建

客户端搭建也就是对于服务提供者和服务消费者的搭建。

2.1 创建客户端模块并引入依赖(所有项目基于spring-boot开发)

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

2.2 创建application.yml文件并配置相关属性

eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka
spring:
   application:
    name: orderservice #当前项目名称

需要将eureka注册中心的信息配置

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

服务提供者启动时向eureka注册自己的信息 eureka保存这些信息 消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者,

消费者该如何选择?

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

消费者如何感知服务提供者健康状态?

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

b6dbe9f045c44299beea74f55868ae45.png

4 总结

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

二 Ribbon负载均衡

Ribbon是Netflix发布的一个开源项目,主要功能是提供客户端的软件负载均衡算法。Ribbon客户端组件提供了一系列完善的配置项,如连接超时、重试等。Ribbon内置了多种负载均衡策略,如轮询、随机等。Ribbon的工作流程如下:

  1. 服务消费者(例如order-service)发起请求,比如http://userservice/user/1。
  2. Ribbon获取并根据其服务ID(例如userservice)去注册中心(如Eureka或Nacos)拉取服务列表。服务列表包含了该服务ID对应的所有服务实例,例如[localhost:8080, localhost:8081]。
  3. Ribbon获取到服务列表后,会进行负载均衡策略的选择。这个过程由一个负载均衡拦截器完成,获取服务名后向下传递。服务名经过注册中心查询后,将服务列表返回给DynamicServerListLoadBalancer。DynamicServerListLoadBalancer再根据IRule的具体实现(如随机、轮询等),执行不同的负载均衡策略,选择服务列表中的一个服务实例。
  4. 选择服务列表的某个服务后,Ribbon会进行URL修改,将请求的目标地址改为所选择的服务实例的地址,然后请求真正的服务地址。以上步骤完成后,Ribbon就完成了对请求的负载均衡处理,将请求转发到了合适的服务实例上。需要注意的是,Ribbon默认采用的是懒加载策略,即第一次访问时才会去创建LoadBalanceClient,这可能会导致第一次访问的耗时较长。为了解决这个问题,可以开启饥饿加载,即在项目启动时就创建LoadBalanceClient,从而降低第一次访问的耗时。
  5. 开启懒加载的方式: @Beanpublic IRule randomRule(){ return new RandomRule();}配置文件:ribbon: eager-load: enabled: true # 开启饥饿加载 clients: # 指定饥饿加载的服务名称 - userservice
  6. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询 负载均衡自定义方式 代码方式:配置灵活,但修改时需要重新打包发布 配置方式:直观,方便,无需重新打包发布,但是无法做全局配置 饥饿加载 开启饥饿加载 指定饥饿加载的微服务名称

三 Nacos注册中心

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口。

1.Nacos启动方式:

进入bin目录用cmd指令 startup.cmd -m standalone 开启 在集群情况下,用startup.cmd 指令。

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

2.注册服务到Nacos

在项目父工程中添加spring-cloud-alilbaba的管理依赖:

<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客户端也就是项目的子模块中添加客户端依赖

<!-- nacos客户端依赖 -->
<dependency>  
  <groupId>com.alibaba.cloud</groupId>   
 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

修改appliation.yml文件,将Eureka注册信息注释掉,并配置Nacos地址

  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:

项目启动成功后,就会在Nacos网站上看到注册信息

3a54d4da0e064658b3eeb99054c47d3b.png

2.Nacos服务分级模型

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高 本地集群不可访问时,再去访问其它集群 Nacos的服务分级存储模型可分为三级:一级是服务,例如userservice 二级是集群,例如杭州或上海 三级是实例,例如杭州机房的某台部署了userservice的服务器

53e191f206184d3987fff59e6eb96071.png

那么怎么配置服务集群呢?

我们只需要在Nacos的配置文件里添加一个配置信息discovery.cluster-name即可

  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:
        cluster-name: HZ #配置集群名称,也就是机房位置

除此之外,还得配置Nacos的负载均衡策略

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

注意:这个负载均衡策略的配置,是对于同一个集群中,如果A服务访问B服务,那么想让A优先访问B服务,就在A服务中配置B服务的负载均衡策略

四 Feign

Fegin是一个声明式的http客户端 用于发送http请求

feign使用

  1. 客户端引入依赖 第二个依赖主要是用于后面的Feign的性能优化的配置
   <!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

2.在客户端启动类上添加注解**@EnableFeignClients**开启Fegin功能

@SpringBootApplication
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {

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

需要指定Mapper接口的类型 如果需要配置Fegin的默认配置信息,可以添加defaultConfiguration 属性 并将配置类的类型添加

3.编写Feign客户端

@FeignClient(value = "userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

Feign是基于SpringMVC的注解来调用的 如上面程序:

服务名称:userservice 请求spring.application.name为userservice的服务下的接口

请求方式: GET

请求路径: /user/{id}

请求参数: Long id

返回值类型:User

Feign的性能优化


feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数
  1. 一个是日志级别尽量用basic

  2. 配置文件开启httpClient功能,设置连接池参数

在开发中,对于Feign的接口以及相关POJO Feign 的配置都放到一个模块中,并在其他模块中引入该Feign的依赖用于调用API

五 网关Gateway

网关主要是用于身份认证和权限校验 服务路由和负载均衡 请求限流等 总而言之,对于一些请求,网关可以管理其权限,对整个微服务起保护作用

1.搭建网关

1.新建网关模块。引入网关依赖与Nacos发现依赖

   <!--nacos服务注册发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--网关gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
  

2.身份认证以及Nacos注册配置

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
    gateway:
      routes:
        - id: user-service # 路由标示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
        - id: user-service

routes:是一个网关路由配置数组 每个服务的网关配置用 - 表示

id: 唯一标识

uri: 服务地址 lb:表示负载均衡策略 后面跟服务器名称

predicates :断言 表示路径必须符合下面要求才能通过

具体断言的写法有以下11种:

0e717088445d486ca215710c71945b1f.png

下面图为一个具体请求过程

0db474a3a634488b8b66f6fdc115e200.png

3.关于网关过滤器执行顺序:

740062fb7e3043d8bbced41d78f0b82a.png

4.关于网关中解决跨域请求的配置:

9327ca8a12044b6da7fafb56bc08783f.png

标签: 微服务 eureka 学习

本文转载自: https://blog.csdn.net/m0_74939895/article/details/136379695
版权归原作者 向北漫漫无期 所有, 如有侵权,请联系我们删除。

“微服务(Eureka Nacos Feign Gateway)入门”的评论:

还没有评论