【nacos】2.1 Spring Cloud服务协作流程

 返回首页 > 【笔记】Spring Cloud Alibaba Nacos

2 Nacos服务发现快速入门       

        本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud应用程序与Nacos的无缝集成。通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。

2.1  Spring Cloud服务协作流程

    Spring Cloud常见的集成方式是使用Feign+Ribbon技术来完成服务间远程调用负载均衡的,如下图:

(1)   在微服务启动时,会向服务发现中心上报自身实例信息,这里ServiceB包含多个实例。

   每个实例包括:   IP地址 + 端口号

(2)  微服务会定期从Nacos Server(服务发现中心获取服务实例列表。

(3)  当ServiceA调用ServiceB时,ribbon组件从本地服务实例列表中查找ServiceB的实例,如获取了多个实例如Instance1、Instance2。这时ribbon会通过用户所配置的负载均衡策略从中选择一个实例。

(4)  最终,Feign组件会通过ribbon选取的实例发送http请求

    采用Feign + Ribbon的整合方式,是由Feign完成远程调用的整个流程。而 Feign集成了Ribbon,Feign使用Ribbon完成调用实例的负载均衡

2.1.1 负载均衡的概念

        在SpringCloud服务协议流程中,ServiceA通过负载均衡调用ServiceB,下边来了解一下负载均衡:负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发缓解网络压力和进行服务端扩容重要手段之一。它分为服务端负载均衡和客户端负载均衡。

  • 服务器端负载均衡:

    在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。

    例如Nginx,通过Nginx进行负载均衡,客户端发送请求至Nginx,Nginx通过负载均衡算法,在多个服务器之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。

  • 客户器端负载均衡:

      (客户端==Sercive A,在Sercive A上选择好了生产者地址,所以叫客户端负载均衡)

    我们接下来要讲的Ribbon,就属于客户端负载均衡。在ribbon客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均衡算法分配。

    Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选?取决于负载均衡策略。

Ribbon核心组件IRule是负载均衡策略接口,它有如下实现,大家仅做了解:

  • RoundRobinRule(默认):轮询,即按一定的顺序轮换获取实例的地址。
  • RandomRule:随机,即以随机的方式获取实例的地址
  • AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
  • WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的机率越高;刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够时,会切换到WeightedResponseTimeRule
  • RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务;
  • BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
  • ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

    可通过下面方式在spring boot配置文件中修改默认的负载均衡策略:

    account-service.ribbon.NFLoadBalancerRuleclassName-com.netflix.loadbalancer.RandomRule

    account-service是调用的服务的名称,后面的组成部分是固定的。

2.1.2  Feign介绍

    Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更快捷、优雅地调用HTTP API

    Feign的英文表意为“假装,伪装,变形”,可以理解为将HTTP报文请求方式伪装为简单的java接口调用方式。

    参考第1章节的ServiceA调用ServiceB的例子,我们使用Feign实现这个过程,代码如下:

  • Service B 暴露"/service"服务端点,如下:
@SpringBootApplication
@RestController
public class SpringRestProviderBootstrap {
    public static void main(string[] args) {
        SpringApplication.run(springRestProviderBootstrap.class, args);
    ]}

    @GetMapping(value = "/service")//暴露服务
    public String service(){
    return "provider invoke";
    }
}
  • Feign调用方式如下:
  1. 声明Feign客户端
@FeignClient(value = "serviceB")
public interface ServiceBAgent {

    /**
    * 根据用户名查询账号信息 I
    * @param username用户名
    * @return账号信息
    */
    @GetMapping(value = "/service")
    public String service();
}

(2)业务调用

@Autowired
private ServiceBAgent serviceBAgent;

        另外,别忘了,若在在Spring cloud中使用Feign,需要引入以下依赖:

<dependency>
    <groupld>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

        Feign默认集成了Ribbon,可以直接使用

        还需要在spring cloud启动类中标注@EnableFeignClients,表明此项目开启Feign客户端:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class SpringRestConsumerBootstrap {
    public static void main(string[] args) {
        SpringApplication.run(springRestconsumerBootstrap.class, args);
    }
}
posted @   随风落木  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示