官网: 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
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
环境:Java8+Maven
下载:https://github.com/alibaba/nacos/releases/tag/1.1.4
解压安装包,直接运行 bin 目录下的 startup.cmd
http://localhost:8848/nacos: 默认账号密码: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 用于负载均衡
创建 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);
}
}
服务注册中心:
访问测试:
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'
Nacos 用 Namespace+Group+Data ID 的方式区分不同的配置文件。
最外层的 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 就是微服务的实例。
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
类型。默认命名空间新增配置:
新建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
主启动:
@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
测试:
新建命名空间 test,在test下创建 Data ID 为:nacos-config-client-test.yaml Group 为:TEST_GROUP 的配置文件。
修改 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
测试:
Nacos 自带动态刷新
Nacos 默认数据库为嵌入式数据库 derby。
步骤:
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
将 下的 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
由于本地只有一台机器,所以编辑 Nacos 的启动脚本 startup.sh,使它能够接受不同的启动端。
修改思路:启动脚本可以接收 -p 端口号 参数,在指定的端口启动。
第一步:
第二步:
启动 nacos:
在 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;
}
到此 1个Nginx+3个nacos注册中心+1个mysql 已配置完成。
通过 Nginx 访问 nacos,添加一个配置。
查看数据库:
将 5.2 module:cloudalibaba-config-nacos-client3377 注册进 nacos 集群。配置如下:
访问测试: