一、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
中的配置信息。
@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 从入门到精通。