Nacos作为服务注册中心及负载均衡、服务流量权重设置
记录一下关于springcloud alibaba的Nacos、Sentinel相关学习笔记,除了方便自己以后查阅也希望能帮到学习的小伙伴,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!关于它的介绍及功能请看官网,这里贴一下中文的参考地址:参考网址这一篇开始先记录下Nacos相关的东东,主要记录一下Nacos作为服务注册中心和配置中心两部分,即
如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。
记录一下关于springcloud alibaba的Nacos、Sentinel相关学习笔记,除了方便自己以后查阅也希望能帮到学习的小伙伴,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
关于它的介绍及功能请看官网,这里贴一下中文的参考地址:参考网址
这一篇开始先记录下Nacos相关的东东,主要记录一下Nacos作为服务注册中心和配置中心两部分,即Nacos = Eureka+Config +Bus, 更多介绍参考官网:Nacos官方文档
目录
新建服务提供者模块alibaba-provider-server
新建服务消费者模块alibaba-consumer-server
Nacos作为服务注册中心
Nacos可以用来作为服务注册中心来替换Eureka,下面我们分别创建服务提供者和消费者相关模块来进行学习记录。
新建服务提供者模块alibaba-provider-server
pom文件
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
yml文件
server:
port: 9001
spring:
application:
name: alibaba-nacos-provider-server
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos作为配置中心地址
management:
endpoints:
web:
exposure:
include: '*'
启动类
加注解@EnableDiscoveryClient
测试方法
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
测试
启动alibaba-provider-server服务,此时访问http://localhost:8848/nacos,默认用户名密码都为 nocos,可以看到alibaba-provider-server已经注册到nacos上了,如下:
新建服务消费者模块alibaba-consumer-server
上面我们已nacos作为服务注册中心将alibaba-provider-server注册到了nacos,下面我们要创建新的服务也注册到nacos,并调用alibaba-provider-server服务提供的方法完成服务调用测试。
pom文件
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>cloud-commons-server</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
yml文件
server:
port: 83
spring:
application:
name: alibaba-nacos-consumer-server
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://alibaba-nacos-provider-server
启动类
加注解@EnableDiscoveryClient
测试方法
@RestController
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
测试
启动alibaba-consumer-server服务,此时访问http://localhost:8848/nacos可以看到alibaba-consumer-server也已经注册到nacos上了,如下:
访问 http://localhost:83/consumer/payment/nacos/1 如下:
Nacos的负载均衡
另外nacos是可以实现负载均衡的,因为在nacos的依赖包中是包含ribbon的。
为了演示负载均衡效果按照 alibaba-provider-server的方式新建alibaba-provider-server2服务并启动注册到nacos,这里就省略过程了。
配置开启RestTemplate 的负载均衡
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced //开启 @LoadBalanced 与 Ribbon 的集成
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
测试
我们启动alibaba-provider-server2,如下:
多次访问 http://localhost:83/consumer/payment/nacos/1 可以发现9001/9002,轮询负载
服务流量权重支持及流量保护
Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。
权重大小可以在服务列表中的详情中进行配置:
我们多次访问 http://localhost:83/consumer/payment/nacos/1 发现9001/9002还是轮询出现,配置的权重并没有生效,原因在于Nacos是没有集成Ribbon的权重负载算法,而是自己提供了权重负载算法,我们需要通过自定义IRule来加载Nacos提供的权重负载算法,下面按照Ribbon自定义负载均衡算法的方式,编写AbstractLoadBalancerRule子类:
/**
* 自定义负载均衡算法
*/
public class NacosWeightLoadBalanceRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {}
@Resource
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public Server choose(Object key) {
// 1.获取服务的名称
BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
String serverName = loadBalancer.getName();
// 2.此时Nacos Client会自动实现基于权重的负载均衡算法
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
try {
Instance instance = namingService.selectOneHealthyInstance(serverName);
return new NacosServer(instance);
} catch (NacosException e) {
e.printStackTrace();
}
return null;
}
}
然后我们还需要加载NacosWeightLoadBalanceRule 到Spring容器中,在ApplicationContextConfig 中追加IRule的bean,如下:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //开启 @LoadBalanced 与 Ribbon 的集成
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public IRule getLoadBalancerRule(){
return new NacosWeightLoadBalanceRule();
}
}
重启服务后再次多次访问 http://localhost:83/consumer/payment/nacos/1 发现9001/9002并没有轮询出现,而是9001出现的频率远多于9001,权重配置生效。
服务上下线
Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮,被下线的实例,将不会包含在健康的实例列表里。效果同设置服务的权重为0,不再实例接收流量,比如我们将9001的实例下线,访问http://localhost:83/consumer/payment/nacos/1时将总是访问到9002服务:
Nacos对CP/AP的支持
至此使用nacos作为服务注册中心的测试结束,补充下,nacos是同时支持ap和cp两种模式的,可以通过一下命令进行切换:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
另外网上有人说nacos的权重配置范围是0-1,但是上面我配置的权重为10也是生效的。
更多推荐
所有评论(0)