1. NacosB站尚硅谷P95~P110
代码Gitee地址
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
注册中心和配置中心的组合。
注册中心区别:
-
直接使用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。
-
分别新建module:cloudalibaba-provider-payment9001和9002、9003;
-
依赖:
org.springframework.boot spring-boot-devtools com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test com.alibaba fastjson 1.2.62 -
配置文件:记得三个提供者端口不同。
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; } } -
启动三个微服务测试:可以看到三个服务实例
-
新建module:cloudalibaba-consumer-order83;
-
依赖:
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-devtools org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test -
配置文件:
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实现了负载均衡
nacos可以实现ap和cp的切换。
- 切换CP/AP方式:ip:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP,必须是put类型请求。
1.3.1 项目测试直接将配置写入nacos中。
-
新建module:cloudalibaba-config-client3377
-
依赖:
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 org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test -
配置:
- 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的配置
-
再次修改配置文件之后,访问接口:可以发现实现了自动更新。
类似于Java的包名和类名,最外层namespeace可以用于区分部署环境,group和dataId逻辑上区分两个目标对象。
指定spring.profiles.active来配置不同的环境,读取不同的配置文件。
-
在默认的namespace和默认的group下额外新建一个dataId为nacos-config-client-test.yaml的配置文件。
-
修改本地3377的application.yml:
spring: profiles: active: test # 对应当前环境 -
访问接口测试:可以看出这里已经读取的是test文件。
-
在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 # 对应当前环境 -
访问测试:可以看出访问的是指定组的配置文件。
-
额外新建两个命名空间:
-
新建之后,可以发现在配置列表中多了两个空间:
-
在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的配置文件。
省流,这部分出问题了,建议忽略。
这里的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的原因,暂时搁置。
-
参考地址:使用docker安装nacos并配置mysql8.0
由于无法实现三台虚拟机,鸽了。



