Nacos作为注册中心的简单使用

Spring Cloud Alibaba概述

2018.10.31, Spring Cloud Alibaba 正式入驻了Spring Cloud官方孵化器,并在Maven中央仓库发布了第一个版本。

Spring Cloud Alibaba支持:

  • 服务限流降级:默认支持Servlet、Feign. RestTemplate、 Dubbo 和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics监控。
  • 服务注册与发现:适配Spring Cloud服务注册与发现标准,默认集成了Ribbon的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于Spring Cloud Stream为微服务应用构建消息驱动能力.
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、可靠高可用的定时(基于Cron表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有Worker (schedulerx-client). 上执行。

Nacos概述

为什么叫Nacos:前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。

是一个服务发现、配置管理和服务管理平台。可以替代eureka+config+bus

各注册中心比较

- Nacos Eureka Consul CoreDNS ZooKeeper
一致性协议 CP+AP AP CP / CP
健康检查 TCP/HTTP/MySQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd / Client Beat
负载均衡 权重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
SpringCloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8s集成 支持 不支持 支持 支持 不支持

使用

Nacos server下载和运行

Nacos-server下载: https://github.com/alibaba/nacos/releases

这里选择nacos-server-1.1.4.tar.gz下载并解压:

wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.zip
tar -xvf nacos-server-1.1.4.tar.gz

启动服务器(非集群模式):

cd nacos/bin
sh startup.sh -m standalone

ubuntu可以使用:

bash startup.sh -m standalone

启动成功后,访问 http://localhost:8848/nacos 即可看到图形界面,默认账号和密码都是nacos

nacos 的docker运行

nacos-docker的github主页: https://github.com/nacos-group/nacos-docker

docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:latest

构建服务提供者模块

新建模块cloudalibaba-provider-payment9001,依赖:

<!-- nacos-discovery -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<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>

因为父工程已经引入

<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring.cloud.alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

这里不再引入

yaml配置:

server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9002.class, args);
    }
}

controller:

@Controller
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "nacos registry, serverPort: " + serverPort+"\t id:" +id;
    }
}

运行该模块,可以查看到该服务被注册到nacos上面了,再建立一个内容相同的9002模块并启动,可以看到该服务存在两个实例:

Nacos作为注册中心的简单使用

服务调用者模块搭建

新建模块cloudalibaba-consumer-nacos-order83,依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.rhett</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
</dependency>
<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>

yaml配置:

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

# 消费者将要去访问的微服务名称,这是自定义配置项
service-url:
  nacos-user-service: http://nacos-payment-provider

启动类:

@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class, args);
    }
}

配置RestTemplate:

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

controller:

@RestController
@Slf4j
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverUrl;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id){
        return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
    }
}

访问 http://localhost:83/consumer/payment/nacos/13 即可看到9001、9002交替提供服务,是因为nacos已经继承了ribbon负载均衡:

Nacos作为注册中心的简单使用

Nacos AP和CP的切换

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

切换方法:向 $NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP 发送POST请求

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/nacos%e4%bd%9c%e4%b8%ba%e6%b3%a8%e5%86%8c%e4%b8%ad%e5%bf%83%e7%9a%84%e7%ae%80%e5%8d%95%e4%bd%bf%e7%94%a8/

发表评论

电子邮件地址不会被公开。