目录
1. SpringCloud Alibaba概述
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,只需要添加一些注解和少量配置就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
上面的官网链接首页大概讲述了SpringCloud Alibaba的主要功能、组件。以下是我对于SpringCloud Alibaba Nacos使用过程的一些小结。
2. Nacos概述
2.1 Nacos简介
Nacos(Dynamic Naming and Configuration Service),作为一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,简单来说就是Nacos就是注册中心 + 配置中心的组合(Eureka + Config + Bus)。
2.2 Nacos安装配置
前提是已经安装了java8和maven。
1) 下载Nacos的nacos-server-1.1.4.zip。
2) 解压安装包,然后直接运行bin目录下的startup.cmd。
3) 访问Nacos(localhost:8848/nacos)。
3. Nacos作为服务注册中心的案例
以下案例代码的Github地址。
三个modules分别是:cloudalibaba-provider-payment9001,cloudalibaba-provider-payment9002,cloudalibaba-consumer-nacos-order83。
3.1 基于Nacos的服务提供者
1) 父pom添加SpringCloud Alibaba依赖。
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2) cloudalibaba-provider-payment9001添加Nacos依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3) 配置Nacos。
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
4) 添加接口:
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "Hello Nacos Discovery: " + serverPort + "\t id: " + id;
}
5) 同样的操作创建cloudalibaba-provider-payment9002(注意修改application.yml的端口为9002)。
6) 案例测试:
7) 访问Nacos(localhost:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=)。
3.2 基于Nacos的服务消费者
1) cloudalibaba-consumer-nacos-order83添加Nacos依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2) 配置Nacos。
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
#消费者将去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
3) 添加接口:
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id,String.class);
}
4) 案例测试(RestTemplate加上了@LoadBalanced,集成了ribbon的负载均衡)。
3.3 服务注册中心对比
3.4 Nacos支持AP和CP模式的切换
一般来说,如果不需要存储服务级别的信息且通过nacos-client注册,并能够保持心跳上报那么就可以选择AP。
如果需要在服务级别编辑或存储配置信息,那么CP是必须的,CP模式下支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例前必须先注册服务,如果服务不存在则会返回错误。
4. Nacos作为服务配置中心的案例
以下案例代码的Github地址。
这个modules是:cloudalibaba-config-nacos-client3377。
4.1 服务中心配置
1) 添加Nacos config依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2) 配置bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式配置
3) 配置application.yml
spring:
profiles:
active: dev #表示开发环境
4) 配置动态刷新的接口:
@RestController
@RefreshScope // 支持Nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
4.2 Nacos匹配规则
1) Nacos界面配置信息。
${spring.application.name}-${spring.profile.active}.${file-extension}
- prefix默认为spring.application.name的值。
- spring.profile.active即为当前环境对应的profile,可以通过配置项 spring.profile.active来配置。
- file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。
2)进入Nacos控制台新建配置(nacos-config-client-dev.yaml)。
- nacos-config-client-dev.yaml
- config:
info: this is my Springcloud config test version 1.0.
注:Data ID 的后缀是yaml。
4.3 案例测试
启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件。
1) 访问接口(localhost:3377/config/info)。
2) 修改config信息(version改成2.0)。
3) 访问接口,信配置息已经刷新了。
4.4 Nacos分类配置
最外面的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
默认情况下,Namespace=public ,Group=DEFAULT_GROUP。
1) DataID的案例(指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置)。
- 新建DataID。
- nacos-config-client-test.yaml
- config:
info: this is my Springcloud config(nacos-config-client-test.yaml) test version 1.0. - 通过spring.profile.active属性就能进行多环境下配置文件的读取。
2) Group的案例(通过Group实现环境区别)。
- 新建DataID:nacos-config-client-info.yaml(Group=DEV_GROUP),nacos-config-client-info.yaml(Group=TEST_GROUP)
- 在config下增加一条group的配置即可,可配置为DEV_GROUP或TEST_GROUP。
3) Namespace的案例。
- 新建dev/test的Namespace。
- 在dev的namespace下创建配置信息。
- 修改bootstrap.yml添加namespace配置。
附:
1) 要部署Nacos集群可以参考:Nacos集群部署。