SpringCloud Alibaba第十二章,升级篇,服务注册与配置中心Nacos
一、为什么SpringCloud Alibaba
1、为什么
有了spring cloud这个微服务的框架,为什么又要使用spring cloud alibaba这个框架了?最重要的原因在于spring cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装,同时也新增了一些其他框架。然而Netflix的服务发现组件Eureka已经停止更新,同时Feign、Hystrix、Zuul等也都出于升级或停更进入维护阶段。所以急需其他的一些替代产品,也就是spring cloud alibaba。
2、SpringCloud Alibaba能做什么
1、Nacos
阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。2、Sentinel
阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。3、RocketMQ
Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。4、Dubbo
Apache Dubbo™ 是一款高性能 Java RPC 框架。5、Seata
阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。6、Alibaba Cloud OSS
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储
服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。7、Alibaba Cloud SchedulerX
阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。8、Alibaba Cloud SMS
覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
3、官网和资料
https://github.com/alibaba/spring-cloud-alibabahttps://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
4、引用
cloud_2020项目总POM中引用:
<dependencyManagement><dependencies><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></dependencies>
</dependencyManagement>
二、服务注册与配置中心Nacos
Nacos:Dynamic Naming + Configuration Service
Nacos就是注册中心+配置中心的组合 == 等价于Eureka+Config+Bus
官网:
https://nacos.io/zh-cn/https://nacos.io/zh-cn/docs/quick-start.html
1、Nacos下载与安装(Server)
这里的nacos即 注册中心Server
下载地址:
https://github.com/alibaba/nacos/releases/tag/1.2.1运行:
解压后bin目录下的start浏览:
http://localhost:8848/nacos/#/login账号:nacos 密码:nacos
2、服务注册中心案例(client)
2.1、服务提供者provider-payment-9001
这里nacos,即注册中心client
新建module,cloudalibaba-provider-payment-9001
<parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment-9001</artifactId>
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-provider-payment-9001</artifactId><dependencies><!--nacos discovery服务发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.lee.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- 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.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
application.yml
server:port: 9001spring:application:name: nacos-payment-provider #服务名称cloud:nacos:discovery:server-addr: localhost:8848 #nacos server地址management:endpoints:web:exposure:include: '*'
主启动类
@SpringBootApplication
@EnableDiscoveryClient //服务发现
public class PaymentMain9001 {public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class,args);}
}
业务类PaymentController(读取配置信息)
@RestController
@RequestMapping("/payment")
public class PaymentController {@Value("${server.port}")private String serverPort;@GetMapping(value = "/nacos/{id}")public String getPayment(@PathVariable("id") Integer id){return "nacos registry, serverPort: "+ serverPort+"\t id"+id;}
}
测试:
1、启动nacos server 和 cloudalibaba-provider-payment-9001
2、访问:
http://localhost:9001/payment/nacos/1
结果:
nacos registry, serverPort: 9001 id1
3、访问:
http://localhost:8848/nacos
2.2、服务提供者provider-payment-9002
为了后面测试方便,仿照cloudalibaba-provider-payment-9001创建9002
<parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment-9002</artifactId>
application.yml
server:port: 9002spring:application:name: nacos-payment-provider #服务名称cloud:nacos:discovery:server-addr: localhost:8848 #nacos server地址management:endpoints:web:exposure:include: '*'
2.3、服务消费者consumer-order-83
新建module,cloudalibaba-consumer-order-83
<parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-consumer-order-83</artifactId>
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-consumer-order-83</artifactId><dependencies><!-- nacos服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.lee.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- 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.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
application.yml
server:port: 83spring:application:name: nacos-order-consumer #服务名称cloud:nacos:discovery:server-addr: localhost:8848 #nacos server地址
主启动类
@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class OrderMain83 {public static void main(String[] args) {SpringApplication.run(OrderMain83.class,args);}
}
配置类
/*** 配置类*/
@Configuration
public class ApplicationContextConfig {//标注此注解后,RestTemplate就具有了客户端负载均衡能力---因为使用了注册中心//必须添加此注解,否则java.net.UnknownHostException: NACOS-PAYMENT-PROVIDER@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}}
业务类
@RestController
@RequestMapping("/consumer")
public class OrderController {public static final String serverURL = "http://nacos-payment-provider";@Resourceprivate RestTemplate restTemplate;@GetMapping(value = "/payment/nacos/{id}")public String paymentInfo(@PathVariable("id") Long id){return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);}}
测试:
1、启动nacos-server、cloud-provider-payment-9001、cloud-provider-payment-9002、
cloud-consumer-order-832、访问:http://localhost:83/consumer/payment/nacos/1
结果:
nacos registry, serverPort: 9001 id1
和G
nacos registry, serverPort: 9002 id1
轮询访问3、访问 http://localhost:8848/nacos
结论:nacos内部整合了Ribbon
2.4、各注册中心比较
2.5、Nacos的AP和CP模式切换
CAP:C数据一致性、A可用写、P分区容错性
Nacos默认是AP模式,如下进行切换:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
何时选择何种模式:
AP模式:
如果不需要存储服务级别的信息,且服务实例是通过nacos-client注册,并能够保持心跳上报,那么选择AP模式。
当前的主流服务如springcloud和dubbo都适用AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持
注册临时实例。CP模式:
如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用CP模式。
CP模式支持注册持久化实例,此时则是以raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则返回错误。
3、服务配置中心案例(client)
3.1、基础案例
创建cloudalibaba-provider-payment-9003
<parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-provider-payment-9003</artifactId>
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud_2020</artifactId><groupId>com.lee.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloudalibaba-provider-payment-9003</artifactId><dependencies><!-- nacos配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- nacos服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.lee.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- 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.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
application.yml
server:port: 9003spring:profiles:active: dev
bootstrap.yml
spring:application:name: nacos-payment-provider #服务名称cloud:nacos:discovery:server-addr: localhost:8848 #服务注册中心地址config:server-addr: localhost:8848 #配置中心地址file-extension: yaml #指定yaml格式的配置
主启动类
@SpringBootApplication
@EnableDiscoveryClient//服务发现
public class PaymentMain9003 {public static void main(String[] args) {SpringApplication.run(PaymentMain9003.class,args);}
}
业务类
@RestController
@RefreshScope //实现配置的自动更新
public class ConfigClientController {@Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo() {return configInfo;}}
3.2、Nacos添加对应配置信息
3.2.1、data id配置规则
${prefix}-${spring.profile.active}.${file-extentsion}prefix:默认值为:spring.application.name,也可以通过spring.cloud.nacos.config.prefix来配置spring.profile.active:spring.profile.active不存在时,对应的连接符也将不存在。对应的data id拼接格式为:${prefix}.${file-extension}file-extension:为配置内容的数据格式,可以通过spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型
3.2.2、实操
根据cloudalibaba-provider-payment-9003的bootstrap.yml和application.yml两个配置文件的配置内容,配置如下:
nacos-payment-provider-dev.yaml
配置内容:
config: info: "config info from nacos config center, nacos-payment-provider-dev.yaml,version:1"
3.3、测试
1、启动nacos-server、cloudalibaba-provider-payment-90032、浏览:http://localhost:9003/config/info
结果:
config info from nacos config center, nacos-payment-provider-dev.yaml,version:13、在nacos-server中修改配置文件version为24、浏览http://localhost:9003/config/info
结果:
config info from nacos config center, nacos-payment-provider-dev.yaml,version:2结论:nacos自带动态刷新功能
3.4、分类配置
一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又会产生多个运行环境:开发环境、测试环境、正式环境等。
那么怎么对这些微服务配置进行管理呢?
nacos通过namespace+groupID+dataId三者对不同开发环境、不同微服务进行管理namespace:划分部署环境DEV\TEST\PROD等,默认PUBLIC
group:划分微服务项目,如 order user cms等,默认DEFAULT_GROUP
dataID如上面的命名规则
相关配置:
spring:application:name: nacos-payment-provider #服务名称cloud:nacos:discovery:server-addr: localhost:8848 #服务注册中心地址config:server-addr: localhost:8848 #配置中心地址file-extension: yaml #指定yaml格式的配置namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceIDgroup: CMS #nacos对应的group
namespace配置:
group配置:
测试:
1、启动nacos-server和cloudalibaba-provider-payment-90032、访问:http://localhost:9003/config/info
结果:
namespace:DEV, Group:CMS, Data ID:nacos-payment-provider-dev.yaml. version:1结论:
9003通过namespace + group + data ID三者定位配置文件的位置,从而读取配置文件
4、Nacos集群及持久化配置
这里我们只用1个Nginx服务器,3个Nacos, 1个Mysql, 3个Linux
4.1、Nacos集群安装及持久化切换
1、准备3台Linux虚拟机,它们的IP分别是192.168.0.111 - 192.168.0.107 - 192.168.0.1122、3台服务器上各自下载nacos
wget https://nacos的下载路径(在nacos.io官网上找)3、在nacos的conf目录根据cluster.conf.example夫指出cluster.conf文件
cp cluster.conf.example cluster.conf4、编辑cluster.conf文件内容
vi cluster.conf
############文件内容如下--将3台nacos的服务器地址copy上去即可--将原有内容都删除##########
192.168.0.111:8848
192.168.0.107:8848
192.168.0.112:88485、持久化nacos,修改conf目录下application.properties文件,将nacos的持久化数据库从内嵌的Derby切换成本地的MySQL数据库
vi application.properties
#######在文件底部添加如下--192.168.0.102是我本地windows的IP地址,即MySQL在我windows本地#######spring.datasource.platform=mysqldb.num=1
db.url.0=jdbc:mysql://192.168.0.102:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=admin1236、关闭linux防火墙
systemctl stop firewalld
##查看防火墙状态
systemctl status firewalld
4.2、Mysql数据初始化
【我的mysql在windows本地上192.168.0.102,为了能让nacos和本地mysql连接,关闭本地的防火墙,开启mysql远程访问权限】
从nacos解压包的conf目录下找到nacos-mysql.sql文件CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARSET utf8 COLLATE utf8_general_ci;use nacos_config;将nacos-mysql.sql的文件内容运行一下OK##本地mysql设置可以远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'admin123' WITH GRANT OPTION;
select user,host from user;##关闭本地防火墙
4.3、Nginx配置
我的nginx服务安装在了192.168.0.107上,使用upstream。nginx需要集成nginx_upstream_check_module模块,具体安装方法请看:
https://blog.csdn.net/weixin_30379625/article/details/87693818
4.4、修改cloudalibaba-provider-payment-9003
修改bootstrap.yml,将原来连接nacos的地址修改为NGINX的服务地址
spring:application:name: nacos-payment-provider #服务名称cloud:nacos:discovery:#server-addr: localhost:8848 #服务注册中心地址server-addr: 192.168.0.107:80 #NGINX的服务地址config:#server-addr: localhost:8848 #配置中心地址server-addr: 192.168.0.107:80 #NGINX的服务地址file-extension: yaml #指定yaml格式的配置#namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceID #暂时关闭#group: CMS #nacos对应的group #暂时关闭
4.5、测试
1、启动3个nacos服务
cd /opt/software/nacos/bin
sh startup.sh检测
可以通过查看日志:/opt/software/nacos/logs/start.out
也可以通过访问:
http://192.168.0.111:8848/nacos
http://192.168.0.107:8848/nacos
http://192.168.0.112:8848/nacos
(注意关闭防火墙)2、启动NGINX服务
/usr/local/nginx-1.14.1/sbin/nginc -c /usr/local/nginx-1.14.1/conf/nginx.conf检测
可以通过访问:
http://192.168.0.107:80/nacos
(注意关闭防火墙)通过nginx进入nacos,创建配置文件nacos-payment-provider-dev.yaml配置格式yaml,配置内容如下:
config: info: "this is nacos cluster,version:1"3、启动cloudalibaba-provider-payment-9003
访问:http://localhost:9003/config/info结果:
this is nacos cluster,version:1测试成功,nacos集群配置成功!(在nacos集群管理可以看到各nacos的服务详情)
file-extension: yaml #指定yaml格式的配置#namespace: 0a294291-a318-4a65-b899-17b08772bb39 #nacos对应的namespaceID #暂时关闭#group: CMS #nacos对应的group #暂时关闭
### 4.5、测试```xml
1、启动3个nacos服务
cd /opt/software/nacos/bin
sh startup.sh检测
可以通过查看日志:/opt/software/nacos/logs/start.out
也可以通过访问:
http://192.168.0.111:8848/nacos
http://192.168.0.107:8848/nacos
http://192.168.0.112:8848/nacos
(注意关闭防火墙)2、启动NGINX服务
/usr/local/nginx-1.14.1/sbin/nginc -c /usr/local/nginx-1.14.1/conf/nginx.conf检测
可以通过访问:
http://192.168.0.107:80/nacos
(注意关闭防火墙)通过nginx进入nacos,创建配置文件nacos-payment-provider-dev.yaml配置格式yaml,配置内容如下:
config: info: "this is nacos cluster,version:1"3、启动cloudalibaba-provider-payment-9003
访问:http://localhost:9003/config/info结果:
this is nacos cluster,version:1测试成功,nacos集群配置成功!(在nacos集群管理可以看到各nacos的服务详情)