一、nacos docker 启用
在 docker 上拉取需要的 nacos 版本
docker pull nacos/nacos-server:1.3.1
启用 standalone 模式
docker run -d -e prefer_host_mode=本机ip -e MODE=standalone -v /mydata/nacos/logs:/home/nacos/logs -p 8848:8848 --name nacos nacos/nacos-server:1.3.1
在浏览器地址栏中输入 http://nacos 服务地址: 端口/nacos/ , 默认登录用户和密码都是 nacos
二、nacos 作为注册中心
2.1 服务注册与发现
在 Spring Boot 应用项目中,引入 pom 依赖
<!-- spring cloud 依赖管理 -->
<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 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在配置文件 bootstrap.properties 中配置 nacos server 地址和项目应用的名称
bootstrap.properties : spring boot 项目启动时,优先加载的配置文件
spring.cloud.nacos.discovery.server-addr=( nacos 服务地址: 端口 )
spring.application.name=service-provider
使用 @EnableDiscoveryClient 开启服务注册发现功能
@SpringBootApplication
@EnableDiscoveryClient // 开启 nacos 的服务注册与发现
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在 nacos 服务程序页面中看到注册的服务
2.2 使用 openfeign 进行服务调用
前提:a. A 和 B 都在nacos 上注册了服务;
b. A 在 Controller层 中提供的服务如下
@RestController
@RequestMapping("AService")
public class AController {
@RequestMapping("/getService")
public String getService(){
return "=== get service from A ===";
}
}
B 可以通过配合 openfeign 调用 A 中的服务,在 B 中的操作步骤如下:
1. 导入 openfeign 包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 使用 @EnableFeignClient 开启服务调用功能
// basepackages 表示哪个包下的文件将扫描作为提供远程调用服务的接口
@EnableFeignClients(basePackages = "xxx.xxx.xxx.xxx.feign")
@SpringBootApplication
@MapperScan("xxx.xxx.xxx.xxx.dao")
@EnableDiscoveryClient
public class B_Application {
public static void main(String[] args) {
SpringApplication.run(B_Application.class,args);
}
}
3. 在 xxx/xxx/xxx/xxx/feign 包中创建远程调用 A 服务的接口
@FeignClient("AService") // "AService" 为 A 服务注册在 nacos 上的服务名
public interface AService {
// 复制 A 中提供服务的方法,改为接口方法
// "AService/getService" 为 A 提供 getService 的完整路径
@GetMapping("AService/getService")
String getService();
}
4. 使用 A 的服务
@RestController
public class UsingAService {
@Autowired
AService aService;
@RequestMapping("getBSevice")
public String getBService(){
return aService.getService();
}
}
三、 nacos 作为配置中心
3.1 引入配置中心
1. 在 nacos 上配置好相关的 Namespace 、DataID 和 Group
2. 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3. 在配置文件 bootstrap.properties 中配置 nacos config 的元数据 ,和 需要从 nacos config 上加载的配置文件
spring.cloud.nacos.config.server-addr=( nacos 服务地址: 端口 )
// nacos 上 AService 的配置命名空间,需要写上 AService 配置空间对应的 UUID
spring.cloud.nacos.config.namespace=258043a2-9b20-4012-aa2b-3264f5a3ee94
// 指定 配置 所属的组
// spring.cloud.nacos.config.group=dev
// 加载 namespace 上多个不同的配置
// 指定配置文件
spring.cloud.nacos.config.ext-config[0].data-id=dataSource.yml
// 指定配置文件所属的组
spring.cloud.nacos.config.ext-config[0].group=dev
// 是否 动态更新配置
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=redisConfig.yml
spring.cloud.nacos.config.ext-config[1].group=prod
spring.cloud.nacos.config.ext-config[1].refresh=false
nacos 配置中心,概念
Namespace:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 DataID 的配置。Namespace 的常用场景之一是不同环境或不同服务的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
DataID :通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
Group :对于相同的 DataID 可以用不同的 Group 做区分。做到不同环境下的区分。
最佳实践每个微服务创建自己的 Namespace 进行隔离, Group 来区分 dev , beta , prod 等环境
参考资料: