文章目录
- 1Nacos是什么
- 2 Nacos的特性
- 2.1 服务发现和服务健康监测
- 2.2 配置管理
- 2Nacos的基本应用
- 2.1 从github上下载源码
- 2.2 启动服务
- 2.3 docker下启动
- 2.4 访问nacos
- 3 Nacos注册中心实战
- 3.1 创建一个项目
- 3.2 定义服务接口
- 3.3 实现服务
- 3.4 配置dubbo服务发布
- 3.5 版本规范
- 3.6 构建服务消费者
- 4 Nacos配置中心实战
- 4.1 添加jar包依赖
- 4.2 bootstrap.properties
- 4.3 NacosConfigController
- 4.4 测试过程
- 5 Spring Boot集成Nacos
- 5.1 Spring Boot集成Nacos实现动态配置
- 5.2 Spring Boot集成Nacos实现注册中心
- 6 Nacos的整体架构
1Nacos是什么
注册中心加配置中心的集合体,Nacos提供了统一配置管理、服务发现与注册。 其中服务注册和发现的功能,相当于dubbo里面使用到的zookeeper、 或者spring cloud里面应用到的consoul以及eureka。
2 Nacos的特性
2.1 服务发现和服务健康监测
Nacos提供了基于RPC的服务发现,服务提供者可以将自身的服务通过原生API或者openApi来实现服务的注册,服务消费者可以使用API或者Http来查找和发现服务.
同时,Nacos提供了对服务的实时监控检查,当发现服务不可用时,可以实现对服务的动态下线从而阻止服务消费者向不健康的服务发送请求。
2.2 配置管理
传统的配置管理,是基于项目中的配置文件来实现,当出现配置文件变更时需要重新部署,而动态配置中心可以将配置进行统一的管理,是的配置变得更加灵活以及高效。
动态配置中心可以实现路由规则的动态配置、限流规则的动态配置、动态数据源、开关、动态UI等场景.
国内比较有名的开源配置中心: Aollo / diamond / disconf
2Nacos的基本应用
首先,我们需要先启动Nacos服务,启动服务有两种方式,一种是直接下载已经编译好的包直接运行。另一种是通过源码来构建。 我们基于源码先来构建,因为目前版本发布比较频繁,所以我们看的时候,它的内容也一直在变化。 基本上我们只需要简单了解它的应用就行
2.1 从github上下载源码
代码语言:javascript复制git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos clean install -U
ls -al distribution/target/
cd distribution/target/nacos-server-$version/nacos/bin
2.2 启动服务
linux系统下:
代码语言:javascript复制sh startup.sh -m standalone
window系统:
代码语言:javascript复制cmd startup.cmd
2.3 docker下启动
Nacos也可以直接通过docker安装。
代码语言:javascript复制docker run -d --name nacos-server-8848 -p 8848:8848 --privileged=true -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v
/opt/nacos/logs:/home/nacos/logs --restart=always -e MODE=standalone -e
PREFER_HOST_MODE=hostname nacos/nacos-server
2.4 访问nacos
http://localhost:8848/nacos
默认的帐号密码是:nacos/nacos
3 Nacos注册中心实战
接下来,我们通过一个案例来演示一下spring cloud alibaba下使用nacos实现配置中心以及服务注册的功能。
3.1 创建一个项目
创建一个spring-cloud-dubbo-example的maven工程 分别添加三个模块
- spring-cloud-dubbo-sample-api
- spring-cloud-dubbo-sample-provider
- spring-cloud-dubbo-sample-consumer
其中后面两个模块都是spring boot的应用。
修改 spring-cloud-dubbo-sample-provider
这个模块:
将dependencyManagement部分的依赖移动到parent pom.xml
代码语言:javascript复制spring boot采用2.2.x/ spring cloud alibaba采用2.2.1
<dependencyManagement>
<dependencies>
<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-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
修改spring-cloud-dubbo-sample-provider中的pom.xml,增加parent模块的依赖:
代码语言:javascript复制<parent>
<groupId>com.gupaoedu.dubbo</groupId>
<artifactId>spring-cloud-dubbo-example</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
添加maven依赖:
代码语言:javascript复制<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.gupaoedu.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>spring-cloud-dubbo-sample-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.2 定义服务接口
在spring-boot-dubbo-sample-api模块中,定义接口
代码语言:javascript复制public interface IHelloService {
String sayHello();
}
3.3 实现服务
在spring-boot-dubbo-sample-provider中,实现IHelloService接口
代码语言:javascript复制public class HelloServiceImpl implements IHelloService{
@Override
public String sayHello() {
return "Hello GuPao";
}
}
添加 @EnableDiscoveryClient 注解
代码语言:javascript复制@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudDubboSampleProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDubboSampleProviderApplication.class,args);
}
}
3.4 配置dubbo服务发布
在服务实现类中添加 @Service 注解
代码语言:javascript复制@Service
public class HelloServiceImpl implements IHelloService{
@Override
public String sayHello() {
return "Hello GuPao";
}
}
配置dubbo提供方信息
代码语言:javascript复制# dubbo 服务扫描基础包路径
dubbo.scan.base-packages=com.gupaoedu.dubbo.springclouddubbosampleprovider
dubbo.protocol.id=dubbo
# Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端 口,从 20880 开始)
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
spring.cloud.nacos.discovery.server-addr=192.168.216.128:8848
dubbo.scan.base-packages :
指定 Dubbo 服务实现类的扫描基准包
dubbo.protocol :
Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称, port 为协议端口( -1 表示自增端口,从 20880 开始)
dubbo.registry :
Dubbo 服务注册中心配置,其中子属性 address 的值 “springcloud://localhost”,说明挂载到 Spring Cloud 注册中心
spring.cloud.nacos.discovery :
Nacos 服务发现与注册配置,其中子属性 server-addr指定 Nacos 服务器主机和端口
3.5 版本规范
项目的版本号格式为 x.x.x 的形式,其中 x 的数值类型为数字,从 0 开始取值,且不限于 0~9 这个范围。项目处于孵化器阶段时,第一位版本号固定使用 0,即版本号为 0.x.x 的格式。 由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloudcommons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
- 1.5.x 版本适用于 Spring Boot 1.5.x
- 2.0.x 版本适用于 Spring Boot 2.0.x
- 2.1.x 版本适用于 Spring Boot 2.1.x
- 2.2.x 版本适用于 Spring Boot 2.2.x
3.6 构建服务消费者
添加jar包依赖
代码语言:javascript复制<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.gupaoedu.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>spring-cloud-dubbo-sample-api</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
添加配置文件:
代码语言:javascript复制spring.application.name=spring-cloud-dubbo-sample-consumer
dubbo.application.name=spring-cloud-dubbo-sample-consumer
dubbo.cloud.subscribed-services=spring-cloud-dubbo-sample-provider
spring.cloud.nacos.discovery.server-addr=192.168.216.128:8848
除应用名称 spring.application.name
存在差异外, spring-cloud-dubbo-client-sample
新增了属性 dubbo.cloud.subscribed-services
的设置。并且该值为服务提供方应用 “spring- cloud-dubbo-sample-provider”。
它的主要作用是服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,
” 分割。不推荐使用默认值为 “*
”,它将订阅所有应用。
编写测试代码
代码语言:javascript复制@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudDubboSampleConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDubboSampleConsumerApplication.class, args);
}
@Reference
IHelloService helloService;
@GetMapping("/say")
public String say(){
return helloService.sayHello();
}
}
4 Nacos配置中心实战
在Nacos中,实现动态配置管理,相对于Spring Cloud中的Config来说,友好太多了,先给大家简单演示一下
4.1 添加jar包依赖
代码语言:javascript复制<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
4.2 bootstrap.properties
需要注意,配置中心的ip,需要放在bootstrap.properties文件中,因为需要保证优先级。
代码语言:javascript复制spring.cloud.nacos.config.server-addr=192.168.216.128:8848
4.3 NacosConfigController
创建一个controller,用来测试从nacos配置中心获取数据的场景
dataId 可以认为是一个配置集,一个系统可以有多个配置集,一般我们可以使用包名来命名,从而很好的达到数据分类的目的。
groupId 配置分组,这个和dataId类似,但是它的纬度更高一些,可能是基于项目层面进行划分。
autoRefreshed 自动更新配置。
代码语言:javascript复制@RefreshScope
@RestController
public class NacosController {
@Value("${info:hello Nacos}")
private String info;
@GetMapping("/get")
public String get(){
return info;
}
}
4.4 测试过程
- 启动服务,访问
http://localhost:8080/get
,浏览器会显示info的默认值,因为这个时候nacos还没有配置info的key - 进入控制台,增加配置,dataid=example,groupid=spring-cloud-dubbo-sample-provider, 并且增加 info = xx的value属性
- 再次刷新url,就可以读取到值的变化
5 Spring Boot集成Nacos
通过上面两个案例,我们了解了Nacos作为服务注册中心以及配置中心的基本使用。
从使用过程中不难发现,它的整体部署和使用比Spring Cloud Netflix的Config以及Eureka要方便很多。
另外,Nacos它是一个独立组件,不一定要集成到Spring Cloud中。有些公司没有采用springcloud alibaba,而是直接把nacos作为一个独立组件使用也是可以的,再给大家演示一个Spring Boot集成Nacos实现动态配置和服务注册,虽然本质上是一样,但是在配置上会有一些细微的差异。
5.1 Spring Boot集成Nacos实现动态配置
创建spring boot应用 添加nacos配置中心的依赖
代码语言:javascript复制<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>
创建一个controller作为测试
代码语言:javascript复制@RestController
@NacosPropertySource(dataId = "spring-cloud-dubbo-sample- provider",autoRefreshed = true)
public class TestController {
@NacosValue(value = "${info:defailt value}",autoRefreshed = true)
private String info;
@GetMapping("/get") public String get(){
return info;
}
}
修改application.properties文件
代码语言:javascript复制nacos.config.server-addr=192.168.216.128:8848
5.2 Spring Boot集成Nacos实现注册中心
添加jar包依赖
代码语言:javascript复制<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>
创建一个测试类,用户返回当前nacos服务器上注册的服务列表:
代码语言:javascript复制@RestController
public class ServiceController {
@NacosInjected
private NamingService namingService;
@GetMapping("/discovery")
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
@PostMapping("/registry")
public void registry() throws NacosException {
namingService.registerInstance("example","192.168.1.1",8888,"Test");
}
}
修改application.properties文件:
代码语言:javascript复制nacos.discovery.server-addr=192.168.216.128:8848
- 先调用registry这个接口,向nacos注册服务
- 再访问 http://localhost:8080/discovery?serviceName=example 获取指定服务的实例信息
- 也可以通过直接调用nacos server的服务注册接口进行服务注册
- http://127.0.0.1:8848/nacos/v1/ns/instance? serviceName=example&ip=127.0.0.1&port=8080
6 Nacos的整体架构
Nacos的整体架构还是比较清晰的,看下面这个官方提供的架构图就可以了。