一、Nacos部署
1. 应用下载
进入 Nacos 下载页面选择对应版本并下载至本地,官网直达:Nacos。
2. 持久化
在正式之前需要修改 Nacos 的相关配置,如服务模式与数据的持久化配置。
在 MySQL 中新建数据库 nacos ,然后解压上一步下载的文件并运行 /conf/mysql-schema.sql 脚本文件。
创建数据库之后修改解压目录下的 /conf/application.properties 文件,找到下图中配置取消注释并替换为你的数据库配置。
3. 服务部署
完成上述步骤之后即可启动 Nacos 服务,这里以 Linux 为例,进入解压后的 bin 目录,编辑 startup.sh 脚本将默认启动模式设置为单体模式。
将图中的 mode 修改为 standalone ,然后通过命令 sh startup.sh 启动服务。
启动服务后访问 ip:8848/nacos 即可看到下图内容。
二、服务注册
在上一篇文章中介绍了服务中心的创建与服务激活,在 Nacos 中其自身即服务注册中心,因此无需再自建注册中心直接使用 Nacos 即可,因此这里直接新建 nacos-client 工程模拟服务通过 Nacos 实现服务注册。
之前的文章中提到过 Spring Cloud 的版本与 Spring Boot 的版本相互关联,这里引入的为 Finchley 版本因此 Spring Boot 版本需为 2.0.x 。
1. Pom依赖
在工程的 POM 文件中导入 alibaba 与 Finchley 依赖,同时引入 nacos-discovery 用于服务注册。
文中的涉及的工程中 Spring Boot 版本均为 2.0.x 版本且都导入 alibaba 与 Finchley 依赖,后续将省略不再具体列出。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<artifactId>nacos-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. 项目配置
在工程的 yml 文件中添加下述内容,其中 server-addr 为 Nacos 服务地址。
server:
port: 8091
spring:
application:
name: nacos-client
cloud:
nacos:
discovery:
server-addr: 192.168.0.20:8848
3. 测试接口
在这里为了后续测试添加了一个测试接口。
@RestController
@RequestMapping("/api/client")
public class ClientController {
@GetMapping("/demo")
public String demo() {
return "Hello world!";
}
}
4. 注册激活
在工程启动类上添加 @EnableDiscoveryClient 注解激活服务注册。
@EnableDiscoveryClient
@SpringBootApplication
public class NacosClientApplication {
public static void main(String[] args) {
SpringApplication.run(NacosClientApplication.class, args);
}
}
完成后启动项目访问 Nacos 服务页面即可看到 nacos-client 已成功实现服务注册。
三、服务消费
在 Eureka 微服务文章中讲解了如何实现服务之间的通讯消费,在 Alibaba 中由 Nacos 注册服务之后同理可通过 LoadBalancerClient 或 Feign 实现服务消费,这里以之前 Feign 消费为例。
1. Pom依赖
新建 nacos-feign 工程,在模块依赖中添加 openfeign 依赖,略去 Spring parent 与 Dalston 。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Feign service -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
2. 项目配置
在工程的 YML 配置文件设置 Nacos 服务地址进行服务注册。
server:
port: 8092
spring:
application:
name: nacos-feign
cloud:
nacos:
discovery:
server-addr: 192.168.0.20:8848
3. 调用示例
新建 FeignService 接口并通过 @FeignClient 注解指定目标服务方,其中 @GetMapping 注解配置目标服务的接口地址。
@FeignClient("nacos-client")
public interface FeignService {
@GetMapping("/api/client/demo")
String demo();
}
完成 FeignService 配置之后新建测试接口,通过 @Autowired 注入 FeignService 实例并实现服务调用。
@RestController
@RequestMapping("/api/nacos/feign")
public class FeignController {
@Autowired
private FeignService feignService;
@GetMapping("/demo")
public String demo() {
return feignService.demo();
}
}
4. 注册激活
在项目启动类添加 @EnableDiscoveryClient 注解激活服务注册,其中 @EnableFeignClients 注解用于指定 FeignService 等接口包路径用于启动扫描。
@EnableFeignClients(basePackages = "xyz.ibudai.service")
@EnableDiscoveryClient
@SpringBootApplication
public class NacosFeignApplication {
public static void main(String[] args) {
SpringApplication.run(NacosFeignApplication.class, args);
}
}
完成后同时启动 nacos-client 与 nacos-feign 工程,访问 Nacos 服务列表可以看见两个服务都已注册成功。
通过 API 工具请求 nacos-feign 服务的 /demo 接口,可以看到成功实现服务 nacos-client 中的接口请求并返回结果。
四、配置中心
Nacos 除了实现服务注册中心之外同时提供了另一重要作用——分布式配置中心,即通过 Nacos 实现各个服务模块的 YML 配置文件的统一托管。
1. Pom依赖
新建 nacos-config 工程,在工程中添加 nacos-config 依赖,略去 Spring parent 与 alibaba 等导入依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
2. Nacos配置
在 Nacos 页面访问 配置管理 -> 配置列表 ,在左上角选择 创建配置。
其中 Data Id 设为 nacos-config,GROUP 选用默认值即可,配置格式选择 yaml ,并在配置内容中添加测试信息,具体配置参考下图。
3. 工程配置
在工程 resources 目录下新建 bootstrap.yml 配置文件添加如下内容,注意不是使用默认的 application.yml 文件,因为前者的加载优先级更高。
其中 application.name 需要和上述 Nacos 中创建的文件同名,如创建了配置文件为 nacos-config.yml,则这里配置文件的应用名则需要为:nacos-config。
下述配置中的 group 与 discovery 和 config 中的 namespace 两项可以略去不填,默认值分别为 DEFAULT_GROUP 和 public 。其中 discovery 与 config 两组配置分别对应 Nacos 配置页面的 服务列表 和 配置列表。
server:
port: 8093
spring:
application:
name: nacos-config
cloud:
nacos:
# Default: "DEFAULT_GROUP"
group: DEFAULT_GROUP
discovery:
# Default: public
namespace: public
server-addr: 192.168.0.20:8848
config:
# namespace, use id not name
namespace: ${spring.cloud.nacos.discovery.namespace}
username: nacos
password: nacos
# suffix, default: properties
file-extension: yml
server-addr: ${spring.cloud.nacos.discovery.server-addr}
4. 公共配置
Nacos 同时支持公共服务的配置,通过 shared-dataids 与 refreshable-dataids 属性配置,前端指定文件名称,后者配置时候开启动态刷新(即配置变更无需重复服务)。
通过公共配置服务即可实现基础配置的复用,如系统的数据库连接配置与日志监控配置等信息,无需为每个服务模块编写重复配置,各个模块可选择是否导入即可。
如下示例中我们新建了公共配置 micro-common.yml 配置并添加了一个测试属性 info.common。
在上述的 nacos-config 工程中 bootstrap.yml 文件的基础上添加下述内容读取公共配置,当 shared-dataids 中指定了多个配置时,定义越靠后的配置其文件中相同属性的优先级更高。
如定义了 shared-dataids: a.yml, b.yml 两个公共配置,当 a.yml 与 b.yml 中存在相同配置时最终将会应用 b.yml 中的配置。
spring:
cloud:
nacos:
config:
# Newer load config will override old
shared-dataids: micro-common.yml
# Auto refresh config
refreshable-dataids: micro-common.yml
5. 命名空间
在 Nacos 中通过命名空间 namespace 可实现多个项目的注册管理,不同 namespace 之间相互独立互不影响。
因此即便存在多个微服务项目通过 namespace 也以通过同一个 nacos 服务实现统一管理, namespace 创建如下,注意创建的 namespace 在工程 bootstrap.yml 文件配置时填写为 命名空间ID 而非 命名空间名 。
创建命名空间之后访问 配置列表 或 服务列表 即可看见新建命名空间。
6. 服务测试
新建服务测试接口通过 @Value 注解读取 Nacos 中的配置信息。
注 @Value 与 @ConfigurationProperties 注解所配置的将会实时监听 Nacos 变化并生效,由配置 spring.cloud.nacos.config.refresh-enabled 控制且默认为 true。
@RestController
@RequestMapping("/api/config")
public class ConfigController {
@Value("${info.name}")
private String infoName;
@Value("${common.name}")
private String commonName;
@GetMapping("/name")
public String name() {
return infoName + " - " + commonName;
}
}
7. 注册激活
如果仅测试分布式配置中心是无需开启服务注册,但在更多的应用场景中其都是与服务注册相耦合。
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
完成后启动项目通过 API 工具请求 /name 测试接口可以看到成功读取 Nacos 中配置的信息。
Talk is cheap, show me you code。
文中示例工程已上传 GitHub ,仓库直达。
参考链接:Spring Cloud 从入门到精通。