如果我的博客对你有帮助,欢迎进行评论✏️✏️、点赞👍👍、收藏⭐️⭐️,满足一下我的虚荣心💖🙏🙏🙏 。

记录一下关于springcloud alibaba的Nacos、Sentinel相关学习笔记,除了方便自己以后查阅也希望能帮到学习的小伙伴,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

关于它的介绍及功能请看官网,这里贴一下中文的参考地址:参考网址

这一篇开始先记录下Nacos相关的东东,主要记录一下Nacos作为服务注册中心和配置中心两部分,即Nacos = Eureka+Config +Bus, 更多介绍参考官网:Nacos官方文档

目录

Nacos作为服务注册中心

新建服务提供者模块alibaba-provider-server

pom文件

yml文件 

启动类

测试方法

测试

新建服务消费者模块alibaba-consumer-server 

pom文件

yml文件

启动类

测试方法

测试

Nacos的负载均衡

配置开启RestTemplate 的负载均衡

测试

服务流量权重支持及流量保护

服务上下线

Nacos对CP/AP的支持


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也是生效的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐