【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调用方式如下:
- 声明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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人