SpringCloud——服务注册和配置中心 Nacos

1. SpringCloud alibaba

官网: https://spring.io/projects/spring-cloud-alibaba#overview

github: https://github.com/alibaba/spring-cloud-alibaba

中文:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

1.1 功能

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储
  • 分布式任务调度:提供基于 Cron 表达式的任务调度服务。。
  • 阿里云短信服务

2. Nacos简介

Nacos:Dynamic Naming and Configuration Service

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理中心。

Nacos 就是注册中心+配置中心的组合( Nacos = Eureka+Config+Bus)

作用: 替代 Eureka 做服务注册中心,替代 Config 做服务配置中心。

官网:https://github.com/alibaba/Nacos

文档:https://nacos.io/zh-cn/index.html

          https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

3. 安装并运行 Nacos

环境:Java8+Maven

下载:https://github.com/alibaba/nacos/releases/tag/1.1.4

解压安装包,直接运行 bin 目录下的 startup.cmd

SpringCloud——服务注册和配置中心 Nacos_第1张图片

http://localhost:8848/nacos: 默认账号密码:nacos

SpringCloud——服务注册和配置中心 Nacos_第2张图片

4. Nacos 作为服务注册中心

4.1 基于Nacos的服务提供者

新建 module:cloudalibaba-provider-payment9001

父POM:



  com.alibaba.cloud
  spring-cloud-alibaba-dependencies
  2.1.0.RELEASE
  pom
  import

本模块POM:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-actuator

YML:

server:
    port: 9001
spring:
    application:
        name: nacos-payment-provider
    cloud:
        nacos:
            discovery:
                server-addr: localhost:8848  # 配置 Nacos 地址
management:
    endpoints:
        web:
            exposure:
                include: '*'

主启动:

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

业务类:

@RestController
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;
    }
}

同样创建 module:cloudalibaba-provider-payment9002  用于负载均衡

4.2 基于Nacos的服务消费者

创建 module: cloudalibaba-consumer-nacos-order83

POM: 同 4.1

YML:

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);
    }
}

业务类:

ApplicationContextBean:

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

controller:

@RestController
public class OrderNacosController {
    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @Autowired
    private RestTemplate restTemplate;

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

}

4.3 测试

服务注册中心:

SpringCloud——服务注册和配置中心 Nacos_第3张图片

访问测试:

SpringCloud——服务注册和配置中心 Nacos_第4张图片

SpringCloud——服务注册和配置中心 Nacos_第5张图片

4.4 各种注册中心对比

SpringCloud——服务注册和配置中心 Nacos_第6张图片

Nacos 支持 AP 和 CP 模式的切换

C:所有节点在同一时间看到的数据是一致的;A:所有的请求都会收到响应。

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

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

切换命令: curl  -X  PUT  '$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

5. Nacos 作为配置中心

Nacos 用 Namespace+Group+Data ID 的方式区分不同的配置文件。

SpringCloud——服务注册和配置中心 Nacos_第7张图片

最外层的 namespace 可以用于区分部署环境的,Group 和 DatalD 逻辑 上区分两个目标对象。

默认情况:Namespace=public,Group=DEFAULT_ GROUP,Cluster=DEFAULT

Nacos 默认的命名空间是 public,Namespace 主要用来实现隔离。比如有三个环境:发、测试、生产环境,就可以创建三个Namespace,不同的 Namespace 之间是隔离的。

Group 默认是 DEFAULT_ GROUP,Group 可以把不同的微服务划分到同一个分组里面去。

Service 就是微服务,一个 Service 可以包含多个 Cluster (集群),Cluster是对指定微服务的一个虚拟划分。

比如为了容灾,将 Service 微服务分别部署在了杭州机房和广州机房,可以给杭州机房的 Service 微服务起一个集群名称(HZ) ,
给广州机房的Service微服务起一个集群名称 (GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

Instance 就是微服务的实例。

5.1 Nacos中的匹配规则

dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

5.2 示例

默认命名空间新增配置:

SpringCloud——服务注册和配置中心 Nacos_第8张图片

 

新建module:cloudalibaba-config-nacos-client3377

pom:



	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-config



	com.alibaba.cloud
	spring-cloud-starter-alibaba-nacos-discovery



	org.springframework.boot
	spring-boot-starter-web


	org.springframework.boot
	spring-boot-starter-actuator

bootstrap.yml

server:
    port: 3377
spring:
    application:
        name: nacos-config-client
    cloud:
        nacos:
            discovery:
                server-addr: localhost:8848
            config:
                server-addr: localhost:8848 # 配置中心地址
                file-extension: yaml # 指定配置格式

# ${prefix}-${spring.profile.active}.${file-extension}

# nacos-config-client-dev.yaml

application.yml

spring:
    profiles:
        active: dev

 

SpringCloud——服务注册和配置中心 Nacos_第9张图片

主启动:

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

业务类:

@RestController
@RefreshScope
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

@RefreshScope

测试:

SpringCloud——服务注册和配置中心 Nacos_第10张图片

 

新建命名空间 test,在test下创建 Data ID 为:nacos-config-client-test.yaml  Group 为:TEST_GROUP  的配置文件。

SpringCloud——服务注册和配置中心 Nacos_第11张图片

修改 YML:

bootstrap.yml

server:
    port: 3377
spring:
    application:
        name: nacos-config-client
    cloud:
        nacos:
            discovery:
                server-addr: localhost:8848
            config:
                server-addr: localhost:8848 # 配置中心地址
                file-extension: yaml # 指定配置格式
                group: TEST_GROUP
                namespace: 5a6be837-1c88-4acf-8d55-8992deab9320

# ${prefix}-${spring.profile.active}.${file-extension}

# nacos-config-client-dev.yaml

group: TEST_GROUP
namespace: 5a6be837-1c88-4acf-8d55-8992deab9320 

application.yml

spring:
    profiles:
        active: test

测试:

SpringCloud——服务注册和配置中心 Nacos_第12张图片

 

Nacos 自带动态刷新

6. Nacos 集群和持久化配置


 

SpringCloud——服务注册和配置中心 Nacos_第13张图片

 

6.1 数据库切换

Nacos 默认数据库为嵌入式数据库 derby。

步骤:

  • 安装 mysql 数据库,版本要求:5.6.5+
  • 初始化 mysql 数据库,数据库初始化文件:nacos-mysql.sql
  • 修改 conf/application.properties 文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

6.2 集群配置 cluster.conf

将 下的 conf/cluster.conf.example 复制出一个 cluster.conf。内容:

192.168.214.10:3333
192.168.214.10:4444
192.168.214.10:5555

【注】IP不能写127.0.0.1,必须是Linux命令 hostname -i 能够识别的IP

6.3 启动 多台 Nacos

由于本地只有一台机器,所以编辑 Nacos 的启动脚本 startup.sh,使它能够接受不同的启动端。

修改思路:启动脚本可以接收 -p 端口号 参数,在指定的端口启动。

第一步:

SpringCloud——服务注册和配置中心 Nacos_第14张图片

第二步:

启动 nacos:

SpringCloud——服务注册和配置中心 Nacos_第15张图片

6.4 配置 Nginx

在 http 模块下配置:

    upstream cluster{                                                        
    	   server 127.0.0.1:3333;
        server 127.0.0.1:4444;
        server 127.0.0.1:5555;
    }

在 server 模块下配置: 

    location / {
        proxy_pass 	http://cluster;
    }

6.5 测试

到此 1个Nginx+3个nacos注册中心+1个mysql 已配置完成。

通过 Nginx 访问 nacos,添加一个配置。

SpringCloud——服务注册和配置中心 Nacos_第16张图片

查看数据库:

SpringCloud——服务注册和配置中心 Nacos_第17张图片

将 5.2 module:cloudalibaba-config-nacos-client3377 注册进 nacos 集群。配置如下:

SpringCloud——服务注册和配置中心 Nacos_第18张图片

访问测试:

SpringCloud——服务注册和配置中心 Nacos_第19张图片

 

 

你可能感兴趣的:(SpringCloud,分布式,nginx,nacos)