Nacos服务治理—负载均衡

引入负载均衡

在消费方引入负载均衡机制,同时简化获取服务提供者信息的流程

Spring Cloud引入组件LoadBalance实现负载均衡
添加依赖

复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

properties配置

复制代码
spring.application.name=service-consumer
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
server.port=6082

主类上添加对应的注解

复制代码
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer2Application {
public static void main(String[] args) {
SpringApplication.run(Consumer2Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

定义对应的控制器,需要访问服务提供者

复制代码
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{name}")
public String test(@PathVariable String name){
//使用LB后具体的URL地址中使用服务提供者的名称来替代原始的主机名和端口号
String res = restTemplate.getForObject("http://serviceprovider/users/hello?username=" + name, String.class);
return res;
}
}

验证测试

缓存配置

使用LB从Nacos获取服务的注册信息,可以在本地进行缓存。添加配置即可

复制代码
spring.cloud.loadbalancer.cache.enabled=true 启用本地缓存,可以根据实际情况权衡
spring.cloud.loadbalancer.cache.capacity=1000 设置缓存空间大小
spring.cloud.loadbalancer.cache.ttl=20 缓存的存活时间,单位为s

订阅更新

缓存有可能和远程的注册信息不一致,所以引入长连接的订阅实现Nacos的主动通知更改

复制代码
spring.cloud.nacos.discovery.watch.enabled=true

引入OpenFeign

添加依赖:

复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

定义配置

复制代码
server.port=6083
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=service-consumer
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

在主类或者配置类上添加注解以支持OpenClient应用

复制代码
@EnableFeignClients // 激活 @FeignClient
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}

定义http伪客户端接口

复制代码
@FeignClient("service-provider") // 指向服务提供者应用
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}

定义控制器,通过feign接口调用远程的服务提供者

复制代码
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private ProviderClient providerClient;
@GetMapping("/{name}")
public String test(@PathVariable String name){
String res = providerClient.sayHello(name);
return res;
}
}

测试

负载均衡策略配置

LB中提供了三种负载均衡策略,同时提供接口允许用户自定义扩展

1、定义配置类

复制代码
public class FeignClientConfiguration {
@Bean
public ReactorLoadBalancer
reactorServiceInstanceLoadBalancer(ObjectProvider
serviceInstanceListSuppliers, Environment environment) {
String name =
environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(serviceInstanceListSuppliers, name);
}
}

2、可以全局或者局部配置使用设置的负载均衡策略

复制代码
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}

局部配置

如果通过使用OpenFeign访问远程的服务提供者,则可以配置由于网络、连接、读取等问题出现访问失

败时,自动执行重试处理

1、首先定义配置

复制代码
public class FeignClientConfiguration {
@Bean
public Retryer retryer(){
return new Retryer.Default(100, 1000, 2);
//表示每间隔100ms,最大间隔1000ms重试一次,最大重试次数是1,因为第三个参数包含了
第一次请求
}
}

2、可以在注解中进行全局配置和局部配置

全局配置

复制代码
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
@EnableDiscoveryClient
@SpringBootApplication
public class Consumer3Application {
public static void main(String[] args) {
SpringApplication.run(Consumer3Application.class, args);
}
}

局部配置

复制代码
@FeignClient(value="service-provider",configuration =
FeignClientConfiguration.class)
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}

服务降级配置

在使用注册中心时,OpenFeign作为服务间通信的组件,它本身集成了负载均衡能力、错误重试、日

志、服务熔断等机制,同时也能够支持点对点的通信方式,让开发者感觉更像是调用本地接口,而不是

发起HTTP请求

具体的服务降级是依赖Sentinel组件实现的,所以需要添加Sentinel依赖

1、添加依赖

复制代码
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、开启服务熔断配置application.properties

复制代码
feign.circuitbreaker.enabled=true 1

3、定义对应的Fallback Factory实现

复制代码
@Component
public class ProviderClientFallbackFactory implements
FallbackFactory<ProviderClient> {
@Override
public ProviderClient create(Throwable cause) {
return new ProviderClient() {
@Override
public String sayHello(String username) {
return cause.getMessage();
}
};
}
}

4、配置使用Fallback降级处理

复制代码
@FeignClient(value="service-provider",fallbackFactory =
ProviderClientFallbackFactory.class)
public interface ProviderClient {
@GetMapping("/users/hello")
public String sayHello(@RequestParam("username") String username);
}
相关推荐
猿java16 小时前
Feign如何实现负载均衡?它和Ribbon有什么关系?
面试·架构·负载均衡
青衫客3618 小时前
负载均衡之带权重的随机负载均衡算法详解与实现
运维·服务器·负载均衡
程序猿不脱发22 天前
聊聊负载均衡架构
运维·架构·负载均衡
云川之下2 天前
【网络】使用 DNAT 进行负载均衡时,若未配置配套的 SNAT,回包失败
运维·网络·负载均衡
yuxb733 天前
集群与负载均衡:HAProxy 与 Nginx 实践
运维·nginx·负载均衡
牛奶咖啡133 天前
云计算核心技术之云网络技术
云计算·负载均衡·云网络技术·专有/私有网络vpc·vpc系统架构·云网络关键技术·容器云网络技术
努力买辣条4 天前
基于Docker的高可用WordPress集群部署:Nginx负载均衡+Mysql主从复制+ProxySQL读写分离
nginx·docker·负载均衡
百思可瑞教育6 天前
Spring Cloud Gateway 负载均衡全面指南
运维·负载均衡·北京百思可瑞教育·百思可瑞教育·北京百思教育
朱皮皮呀7 天前
微服务流量分发核心:Spring Cloud 负载均衡解析
spring cloud·微服务·负载均衡