微服务之Spring cloud alibaba入门——Nacos篇
一. 官网简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
二. Nacos安装
- 方式一:Window安装Nacos
- 准备基本环境
保证电脑为64位系统、jdk1.8+、Maven 3.2.x+、 - 从 Github 上下载编译后压缩包并解压
下载地址 - 测试运行
进入到bin目录下,双击startup.cmd运行Nacos,在服务器中输入http://localhost:8848/nacos测试,出现Nacos的管理界面则说明环境搭建成功
- 方式二:虚拟机Linux系统基于docker搭建Nacos集群
- 准备基本环境
docker、docker-compose 、git - 下载nacos
使用以下命令下载nacos,生成目录nacos-docker
git clone https://github.com/nacos-group/nacos-docker.git - 准备cluster-hostname.yaml文件
进入nacos-docker/example目录下,打开cluster-hostname.yaml文件,其集群配置如下:
version: "3"
services:
nacos1:
hostname: nacos1
container_name: nacos1
image: nacos/nacos-server:latest
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9555:9555"
env_file:
- ../env/nacos-hostname.env
restart: always
depends_on:
- mysql
nacos2:
hostname: nacos2
image: nacos/nacos-server:latest
container_name: nacos2
volumes:
- ./cluster-logs/nacos2:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8849:8848"
env_file:
- ../env/nacos-hostname.env
restart: always
depends_on:
- mysql
nacos3:
hostname: nacos3
image: nacos/nacos-server:latest
container_name: nacos3
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8850:8848"
env_file:
- ../env/nacos-hostname.env
restart: always
depends_on:
- mysql
mysql:
container_name: mysql
image: nacos/nacos-mysql:5.7
env_file:
- ../env/mysql.env
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
- 启动Nacos
在nacos-docker目录下用以下命令启动Nacos集群
docker-compose -f example/cluster-hostname.yaml up
三. Nacos——服务提供者
配置两个服务提供者,端口号分别为8510和8511,除了端口其他配置完全相同,此处只记录8511的配置。
- 引入依赖
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 编写application.yml配置文件
server:
port: 8510
spring:
application:
name: alibaba-nacos-provider
cloud:
nacos:
discovery:
#本地nacos地址,集群配置:http://192.168.192.129:8848,http://192.168.192.129:8849,http://192.168.192.129:8850
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
- 编写主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Nacos8510Application {
public static void main(String[] args) {
SpringApplication.run(Nacos8510Application.class, args);
}
}
- 编写测试类
该类用于测试Nacos的负载均衡功能,在请求时会返回相应服务的端口号
@RestController
public class HelloController {
@Value("${server.port}")
private String ports;
@RequestMapping(value = "/nacos/{id}", method = RequestMethod.GET)
public String hello(@PathVariable("id") Integer id) {
return "Hello Nacos Discovery:"+ports+",id为:"+id;
}
}
四. Nacos——服务消费者
- 引入依赖
和服务提供者的依赖完全相同 - 编写application.yml
server:
port: 8610
spring:
application:
name: alibaba-nacos-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置nacos的地址
- 编写主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Nacos8610Application {
public static void main(String[] args) {
SpringApplication.run(Nacos8610Application.class,args);
}
}
- 编写RestTemplate配置类
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- 编写调用类
表示调用alibaba-nacos-provider服务的nacos/id方法
@RestController
public class HelloController {
@Resource
private RestTemplate template;
@GetMapping("/consumer/nacos/{id}")
public String hello(@PathVariable("id") Integer id){
return template.getForObject("http://alibaba-nacos-provider/nacos/"+id,String.class);
}
}
五. Nacos——配置中心
spring cloud实现配置中心所用的技术为spring cloud config,若要实现配置动态刷新则需要配合spring cloud bus。而Nacos也可作为配置中心,而且可以很方便的实现配置的动态刷新,以下用来创建一个拉取Nacos配置的Springboot项目。
配置中心的基本名词介绍:
名称 | 简介 |
---|---|
namespace | 命名空间,初始有一个public命名空间,public不可以删除 |
group | 组,不同的命名空间下会有不同的组 |
dataid | 配置名称,不同的组下会有不同的配置 |
- 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
创建配置文件
该项目拉取的是Nacos中保存的配置,那么该配置需要相关人员提前编好放到服务器上面,那么其配置的命名必须要遵守一定的格式,该dataid有两种命名方案:- 格式一:{prefix}-{spring.profile.active}.{file-extension}
- 格式二:{prefix}.{file-extension}
prefix在bootstrap.yml中配置,默认为应用名;spring.profile.active在application.yml中配置,file-extension也在bootstrap.yml中配置,为要拉取的配置文件后缀名
以下为配置文件的内容
属性 内容 Data ID nacos-config-client-dev.yaml Group DEFAULT_GROUP 配置内容 config.info=“Hello Nacos dev version=1”(修改为对应的yml格式) 修改application.yml配置
spring:
profiles:
active: dev # 代表拉取的是dev文件
- 编写bootstrap.yml配置文件
server:
port: 3377
spring:
application:
name: nacos-config-client # 对应配置中心配置文件的prefix
cloud:
nacos:
discovery: # 注册中心的地址
server-addr: http://192.168.192.129:8848,http://192.168.192.129:8849,http://192.168.192.129:8850
config: #配置中心的地址
server-addr: http://192.168.192.129:8848,http://192.168.192.129:8849,http://192.168.192.129:8850 #配置中心的地址
file-extension: yaml # 要拉取的配置文件后缀
# namespace: ssad 可以配置命名空间id,默认为public
group: DEFAULT_GROUP #配置分组,默认为DEFAULT_GROUP
- 编写主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Config3377Application {
public static void main(String[] args) {
SpringApplication.run(Config3377Application.class,args);
}
}
- 编写测试类
config.info是配置文件中的属性,若成功拉取到了配置,那么调用该方法会将该信息返回到页面,添加了@RefreshScope注解就实现了配置的自动刷新。
@RestController
@RefreshScope //默认实现了配置自动刷新
public class InfoController {
@Value("${config.info}")
private String info;
@GetMapping(value = "/info")
public String getInfo(){
return info;
}
}
六. 服务注册中心对比
七. 下一篇介绍
本文简要介绍了alibaba Nacos的使用,下面讲对Alibaba sentinel进行介绍。
版权声明:本文为NWU_LK原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。