注册中心请求原理图:
说明: 看上图就知道注册中心其实还是依赖于第三者nacos-server来进行各大服务的注册及负载均衡的,那实战中,那肯定是需要在微服务中集成nacos配置,并且启动nacos-server服务。
1、启动nacos-server
本次启动nacos-server采用docker启动,偷点懒哈。
找一下docker镜像: `
docker search nacos-server`
`docker pull nacos/nacos-server`
启动服务:
docker run --name nacos -d -p 8848:8848 --privileged=true -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /home/nacos/logs:/home/nacos/logs nacos/nacos-server:latest
登录nacos-server管理页面
http://xx.xx.xx.xx:8848/nacos
默认用户账号密码: nacos/nacos
2、集成nacos
本次在springboot、maven环境下引入nacos的依赖jar
在父模块pom.xml中引入以下:
<!--定义版本号-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
<spring-boot.version>2.2.6.RELEASE</spring-boot.version>
<fastjson.version>1.2.58</fastjson.version>
</properties>
<!--继承springboot父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<!--在父类Maven中使用dependencyManagement声明依赖便于子类Module继承使用,也便于进行依赖版本控制-->
<dependencyManagement>
<dependencies>
<!--维护springcloud-->
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${
spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>-->
<!--维护springcloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${
spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${
spring-boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模块atom-user的pom.xml文件中加入
<dependencies>
<!--注册中心/配置中心 nacos 引入-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>${
disruptor.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${
log4j-over-slf4j.version}</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${
fastjson.version}</version>
</dependency>
<!--httpclient依赖包-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${
httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>${
httpcore.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
在application.yml中加入项目应用名和注册中心地址就可以了
注册服务名:spring.application.name
注册中心地址:spring.cloud.nacos.discovery.server-addr
server:
port: 8081
servlet:
context-path: /atom-user
tomcat:
uri-encoding: UTF-8
spring:
application:
name: nacos-provider-atom-user
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
http:
encoding:
force: true
charset: UTF-8
enabled: true
#出现错误时, 直接抛出异常
mvc:
throw-exception-if-no-handler-found: true
resources:
add-mappings: false
cloud:
nacos:
discovery:
server-addr: 8.129.236.49:8848
通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
启动该服务
已经成功注册进来了
说明: 配置中心的原理其实就是把公共配置进行集中缓存处理,集中管理更新等。本次在atom-api服务中引入配置中心。
要使用nacos的配置中心需要引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${
latest.version}</version>
</dependency>
在 bootstrap.properties 中配置 Nacos server 的地址和应用名
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=example
**说明:**之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${
prefix}-${
spring.profiles.active}.${
file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
注意了,接下来有个坑
一定要在bootstrap.yml或bootstrap.properties中添加配置, 不能配置在application.yml中,不然会加载不到配置
原因为:springboot的加载顺序为bootstrap.properties>bootstrap.yml>application.properties>application.yml
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
注意:nacos配置中心默认加载的是spring.application.name.properties , 如果需要改变则指定后缀
启动atom-api服务
说明配置中心已集成。