1. Nacos
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
注册中心和配置中心的组合。
注册中心区别:
1.1 安装nacos
-
直接使用docker安装:
docker pull nacos/nacos-server:1.1.4
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server:1.1.4
-
访问:http://localhost:8848/nacos/index.html,出现如下界面,默认用户名和密码都是
nacos
。
1.2 作为服务注册中心
1.2.1 服务提供者
-
分别新建module:
cloudalibaba-provider-payment9001
和9002、9003; -
依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <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> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> </dependencies>
-
配置文件:记得三个提供者端口不同。
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 NacosMain9001 { public static void main(String[] args) { SpringApplication.run(NacosMain9001.class,args); } }
-
业务类:
@RestController @RequestMapping("payment") public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "serverPort: " + serverPort + "\t id:" + id; } }
-
启动三个微服务测试:可以看到三个服务实例
1.2.2 服务消费者
-
新建module:
cloudalibaba-consumer-order83
; -
依赖:
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</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> </dependencies>
-
配置文件:
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
-
配置RestTemplate
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
-
启动类:
@EnableDiscoveryClient @SpringBootApplication public class NacosOrderMain83 { public static void main(String[] args) { SpringApplication.run(NacosOrderMain83.class, args); } }
-
业务类:
@Slf4j @RestController @RequestMapping("/consumer") public class OrderController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class); } }
-
访问测试:可以看出nacos实现了负载均衡
1.2.3 服务中心对比
nacos可以实现ap和cp的切换。
- 切换CP/AP方式:
ip:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
,必须是put类型请求。
1.3 作为服务配置中心
直接将配置写入nacos中。
1.3.1 项目测试
-
新建module:
cloudalibaba-config-client3377
-
依赖:
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <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> </dependencies>
-
配置:
- 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 #指定yaml格式的配置
- application.yml
spring: profiles: active: dev # 指定环境
- bootstrap.yml
-
Nacos配置规则,参考如下图中,可以看出我们指定的服务名称+环境+后缀结合后,配置文件(dataId)应该是:
nacos-config-client-dev.yaml
-
在nacos界面新增:
-
启动3377测试:可以获取到nacos的配置
-
再次修改配置文件之后,访问接口:可以发现实现了自动更新。
1.3.2 分类配置
1.3.2.1 名命空间
类似于Java的包名和类名,最外层namespeace可以用于区分部署环境,group和dataId逻辑上区分两个目标对象。
1.3.2.2 dataId
指定
spring.profiles.active
来配置不同的环境,读取不同的配置文件。
-
在默认的namespace和默认的group下额外新建一个dataId为
nacos-config-client-test.yaml
的配置文件。
-
修改本地3377的application.yml:
spring: profiles: active: test # 对应当前环境
-
访问接口测试:可以看出这里已经读取的是test文件。
1.3.2.3 Group
-
在nacos新建配置文件,并指定不同的组:
-
在3377的
bootstrap.yml
下指定组来获取(默认为默认组):server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: ip:8848 #服务注册中心地址 config: server-addr: ip:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置 group: TEST_GROUP
-
修改
application.yml
:spring: profiles: active: info # 对应当前环境
-
访问测试:可以看出访问的是指定组的配置文件。
1.3.2.4 Namespace
-
额外新建两个命名空间:
-
新建之后,可以发现在配置列表中多了两个空间:
-
在dev命名空间下,新建一个配置文件并且指定组:
-
修改3377的
bootstrap.yml
:server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: 49.232.141.194:8848 #服务注册中心地址 config: server-addr: 49.232.141.194:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置 namespace: 4a2dfb5f-c3e6-481b-974a-671ddfd39734 # 对应命名空间的编号 group: TEST_GROUP
-
访问测试:可以读到指定namespace下指定group的指定dataId的配置文件。
1.4 集群和持久化配置
省流,这部分出问题了,建议忽略。
这里的vip指的是虚拟ip,即nginx;且官网要求需要对nacos进行持久化,支持的是使用MySQL来实现(默认内部有一个derby数据库,但是多个nacos节点数据存储存在一致性的问题)。
因此实际上的架构图应该是这样:
1.4.1 使用MySQL持久化nacos
省流,这里错了。
-
由于之前使用docker运行nacos容器时,没有指定配置文件等信息,这里重新配置一下。
-
删除原先的nacos容器:
# 暂停 docker stop nacos # 删除 docker rm nacos
-
创建本地挂载目录:
mkdir -p /home/docker/nacos/conf/ touch application.properties mkdir -p /home/docker/nacos/logs
-
修改:
application.properties
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://192.168.xx.xx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai db.user=root db.password=123456
-
在数据库中新建nacos库:并执行:sql文件
-
启动nacos:
docker run \ --name nacos -d \ -p 8848:8848 \ --privileged=true \ --restart=always \ -e JVM_XMS=256m \ -e JVM_XMX=256m \ -e MODE=standalone \ -e PREFER_HOST_MODE=hostname \ -v /home/docker/nacos/logs:/home/nacos/logs \ -v /home/docker/nacos/conf/application.properties:/home/nacos/conf/application.properties \ nacos/nacos-server
-
可以看到用户存储在了MySQL中
-
增加一个配置测试:找不到错误日志,nacos版本太低了,也可能是MySQL是5.7的原因,暂时搁置。
1.4.2 nacos集群
由于无法实现三台虚拟机,鸽了。