一、Nacos
Nacos 主要的功能有配置中心和注册中心。
- 配置中心:通过在 Nacos 上配置用户名,在不重启微服务的情况下实现动态获取配置信息功能。
- 注册中心:创建两个微服务:服务提供者和服务消费者,实现微服务间调用。消费者要调用提供者的接口,只需要声明提供者的微服务名称和接口的请求地址,Nacos 就可准确地找到到对应的接口。
二、SpringBoot 实战
1 运行 Nacos
下载地址:https://github.com/alibaba/nacos/releases
unzip nacos-server-$version.zip #解压
cd nacos/bin
startup.cmd -m standalone #单机模式
访问首页
Nacos 的访问地址:http://localhost:8848/nacos/ 默认账号密码:nacos nacos
页面截图如下:
2 配置中心
创建微服务项目
创建 SpringBoot 项目主要有三种方式:通过网站创建,IntelliJ IDEA 的 Spring Initializr 工具创建,Maven 创建项目形式创建。
项目的pom 文件内容如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--nacos-config的Spring cloud依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
bootstrap.yml 配置
spring:
application:
name: nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
prefix: nacos-config
profiles:
active: dev
Nacos 配置
Nacos 上创建配置文件名称格式:${prefix}-${spring.profile.active}.${file-extension},如上一步bootstrap.yml的配置可知,我要创建的配置名为:nacos-config-dev.yaml,内容如下:
创建 Controller
动态获取用户名称的功能为例:
创建一个对外接口 /username 代码如下:
@RestController
@RefreshScope
public class ConfigController {
@Value("${username:wangzg}")
private String username;
@RequestMapping("/username")
public String userNameInfo() {
return username;
}
}
注意:Controller 上要添加 @RefreshScope注解 它实现了配置的热加载。
验证结果
本地运行项目,可以看到项目的启动时,端口已变为我们在 Nacos 上配置的端口8090。
在浏览器访问链接:http://localhost:8090/username,返回 testuser。修改 Nacos 上 username 的值,不需要重启微服务,重新请求链接 username 的值会动态变。可见 Nacos 作为配置中心实现了热加载功能。
3 注册中心
- 创建服务提供者
创建微服务可参上面配置中心的创建方式,创建对外接口 /sayHello 代码如下:
@RestController
public class ProviderController {
@GetMapping("/sayHello")
public String sayHello(@RequestParam(value = "name",defaultValue = "helloWord")String sayHello){
return "tom say: " + sayHello;
}
}
启动服务,访问地址:http://localhost:8099/sayHello,可输出:tom say: helloWord,表示微服务已创建成功。
- 创建服务消费者
这里采用 FeignClient 的方式实现跨服务间调用(有兴趣的同学也可以研究一下RestTemplate的方式)。
pom 文件
在 nacos-consumer 的 pom 文件要添加 Feigin-Client 的 maven 依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加注解
在微服务启动类 *Application.java 添加注解 @EnableFeignClients。
创建 FeignClient
@FeignClient("nacos-provider")
public interface ProviderClient {
@GetMapping("/sayHello")
String sayHello(@RequestParam(value = "name", defaultValue = "wangzg", required = false) String name);
}
说明:FeignClient 注解传入的 name ,指定FeignClient的名称,如果项目使用了 Ribbon,name 属性会作为微服务的名称,用于服务发现。
创建 ConsumerController
@RestController
public class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/hi-feign")
public String hiFeign(){
return providerClient.sayHello("feign");
}
}
重启工程,在浏览器上访问 http://localhost:8090/hi-feign,可以在浏览器上展示正确的响应,这时 nacos-consumer 调用 nacos-provider 服务成功。
下面一张请求流转的时序图,这样理解清晰一些。
三、最后
微服务有四大特点:
- 小(微服务粒度小)
- 独(独立部署运行和扩展)
- 轻(系统简洁轻量化)
- 松(高内聚低耦合)
要完成一个复杂系统往往需要很多微服务单元,而衔接每个微服务,完成微服务的统一管理就非常有必要,所以集成服务管理中心和配置中心的产品就的就应运而生,而 Nacos 是其中的佼佼者!