当前位置:   article > 正文

Spring Cloud Alibaba的Nacos组件使用_引用springcloudalibabanacos

引用springcloudalibabanacos

nacos是Spring Cloud Alibaba 中的注册中心和配置中心组件,关于什么是Nacos,Nacos是Naming Configuration Service 的简称,可以简单的翻译为配置命名服务。

Nacos的安装和启动:

在正式介绍Nacos之前,先把它搭建在Linux上,并启动,步骤如下:

首先在github上下载Nacos的安装包

github地址:https://github.com/alibaba/nacos/tags

下载解压后在nacos/bin目录下

./startup.sh -m standalone

启动(注意,nacos默认已集群模式启动,这里还未配置集群所以加上-m standalone以单机模式启动)

出现以下提示信息启动成功!

 已经完成了nacos使用的第一步!

(关闭命令为:./shutdown.sh这里不演示)

然后浏览器访问http://localhost:8848/nacos打开nacos的后台页面

(localhost替换为linux的ip地址)

出现这个页面,nacos启动成功!

默认的用户名跟密码都是nacos;

Nacos的注册中心使用:

进入正题,nacos的注册中心主要有三部分组成:

Ø Nacos-Server:注册中心

提供服务的注册和发现。

Ø Nacos-Provider:服务提供方

把自身的服务实例注册到 Nacos Server 中

Ø Nacos-Consumer:服务调用方

通过 Nacos Server 获取服务列表,消费服务。

它们的关系如图:

 Server相当于一个中介,服务的提供者跟服务的消费者将自己的信息注册到注册中心,当有消费者需要调用服务时,通过注册中心获取服务提供者的ip地址端口跟接口信息等,然后服务提供者给消费者发送数据,跟soa架构不同的是,服务提供者也可能是个消费者,房东也可能通过中介租赁商品房!

写个简单的案例:

服务提供者跟服务消费者都需要导入Spring Cloud Alibaba 的nacos依赖

创建服务提供者nacos-provider

pom中导入依赖

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. </dependency>

yaml配置:

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. server-addr: 192.168.209.129:8848 #nacos服务的地址
  6. application:
  7. name: nacos-provider #向注册中心注册的名字

启动类:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class ProviderApp {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProviderApp.class);
  6. }
  7. }

这里提一下@EnableDiscoveryClient注解的作用,这个注解可以将当前工程注册到注册中心,并可以通过注册中心获取其他服务的调用地址

启动测试,打开浏览器的nacos后台可以看到注册的服务信息:

 再测试下消费者nacos-consumer

导入依赖:

  1. <!--nacos客户端-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

yaml配置:

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. server-addr: 192.168.209.129:8848 #nacos服务的地址
  6. application:
  7. name: nacos-consumer #向注册中心注册的名字

 启动类:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class ConsumerApp {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ConsumerApp.class);
  6. }
  7. }

 nacos后台:

 完善下代码,测试consumer通过nacos注册中心调用服务提供者服务:

Provider的controller:

  1. @RestController
  2. @RequestMapping("/provider")
  3. public class ProviderController {
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping("/getUserById/{id}")
  7. public User getUserById(@PathVariable Integer id){
  8. return userService.getUserById(id);
  9. }
  10. }

 sevice

  1. public interface UserService {
  2. User getUserById(Integer id);
  3. }

service实现类

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Override
  4. public User getUserById(Integer id) {
  5. return new User(id,"张三",18);
  6. }
  7. }

Consumer的Controller

  1. @RestController
  2. @RequestMapping("/consumer")
  3. public class ConsumerController {
  4. //访问Rest服务的客户端
  5. @Autowired
  6. private RestTemplate restTemplate;
  7. @Autowired
  8. private DiscoveryClient discoveryClient;
  9. @RequestMapping(value = "/getUserById/{id}")
  10. public User getUserById(@PathVariable Integer id){
  11. //获取Nacos中注册的所有服务信息
  12. List<String> clientServices = discoveryClient.getServices();
  13. for (String clientService : clientServices) {
  14. System.out.println(clientService);
  15. }
  16. //获取nacos中注册的指定服务信息
  17. ServiceInstance serviceInstance = discoveryClient.getInstances("nacos-provider").get(0);
  18. String serviceUrl = serviceInstance.getHost() + ":" + serviceInstance.getPort();
  19. String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
  20. //调用服务
  21. return restTemplate.getForObject(url,User.class);
  22. }
  23. }

配置类,将RestTemplate注册到ioc容器

  1. @Configuration
  2. public class ConfigBean {
  3. @Bean
  4. public RestTemplate restTemplate(){
  5. return new RestTemplate();
  6. }
  7. }

在浏览器的地址栏访问:localhost:81/consumer/getUserById/5

页面显示如下:

 

Nacos的配置中心使用:

我们创建一个新的工程:nacos-config

引入依赖:(Spring Boot的启动器也需要导入这里不列出)

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  4. </dependency>

配置yaml文件,注意,这里使用的配置文件必须以bootstrap命名,而不能使用application,他们的加载优先级关系如下:bootstrap.properties>bootstrap.yaml>application.properties>application.yaml

简而言之bootstrap优先加载,应用于系统级别参数配置,配置的参数一般不会变动;

application应用于SpringBoot项目的自动化配置 可能会根据业务需求做动态配置。比如日志级别,一些开关参数等。

bootstrap.yaml:

  1. spring:
  2. cloud:
  3. nacos:
  4. config:
  5. server-addr: 192.168.204.129:8848
  6. file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
  7. prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}
  8. application:
  9. name: nacos-config

启动类:

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class NacosConfigApp {
  4. public static void main(String[] args) {
  5. SpringApplication.run(NacosConfigApp.class);
  6. }
  7. }

controller:

  1. @RestController
  2. @RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
  3. public class ConfigController {
  4. @Value("${spring.datasource.driver-class-name}")
  5. private String driverClassName;
  6. @Value("${spring.datasource.url}")
  7. private String url;
  8. @Value("${spring.datasource.username}")
  9. private String username;
  10. @Value("${spring.datasource.password}")
  11. private String password;
  12. @Value("${spring.datasource.type}")
  13. private String type;
  14. @GetMapping("/config/info")
  15. public String getConfigInfo() {
  16. System.out.println(this);
  17. String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
  18. +password+"<br>"+type;
  19. return configInfo;
  20. }
  21. }

 这里简单讲一下@RefreshScope注解,该注解的作用是实现对象属性的动态刷新,其具体实现这里不做分析。

然后在Nacos后台的配置中心中添加配置信息:

 这里的Data ID要注意命名规则:

  • 在 Nacos 中,dataId(配置文件的命名的规则) 的完整格式如下:

    ${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}

  • 说明:

    • spring.cloud.nacos.config.prefix:默认是当前服务的服务名称

    • spring.cloud.nacos.config.file-extension:配置文件的格式(后缀),目前只支持yaml和properties

 添加完毕后发布,在浏览器的地址栏输入:localhost/config/info测试:

通过配置中心读取到了配置信息,这里更改password属性为2222再测试一遍

 

 动态获取到了属性变化,这是因为在发布配置时,nacos后台会生成一个MD5编码,当更改配置文件时,MD5编码也会随之改变,而nacos后台可以监控到MD5的变化,从而发布通知给注册的服务。

这里再提一下nacos配置中心的几种隔离模式:

1、Namespace

2、Group

3、Data ID

  • Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等

  • Group: 可以代表某个项目, 如XX医疗项目, XX电商项目

  • DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件

在获取配置集的时候有以下规则:

  1. nacos服务地址,必须指定

  2. namespace,如不指定默认public

  3. group,如不指定默认 DEFAULT_GROUP

  4. dataId,必须指定

Nacos的集群和持久化:

在说集群之前先说一下nacos的持久化:

Nacos默认有自带嵌入式数据库derby,但是在集群模式下,这会导致集群中的Nacos之间信息不对称,无法实现信息共享,比如有三个Nacos,A,B,C,在A中配置了一个配置文件,然后A将其持久化在了自身的derby数据库中,B跟C是无法获取到的,这时需要配置外部的Mysql,所有的Nacos共享这一个Mysql,不管是发布在A还是B还是C上的配置统一在这个Mysql上,实现了数据共享,做集群之前必须先完成Nacos的持久化配置!.

首先第一步,在/nacos/conf目录下修改application.properties文件,增加支持mysql的数据源配置(目前只支持mysql,版本要求:5.6.5+)

  1. ### If use MySQL as datasource:
  2. spring.datasource.platform=mysql
  3. ### Count of DB:
  4. db.num=1
  5. ### Connect URL of DB:
  6. db.url.0=jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
  7. db.user.0=root
  8. db.password.0=1111

将上述配置打开,随后在MySql中创建nacos数据库并导入sql(下载nacos的时候自带有sql脚本)

配置完成后,重启nacos服务,并在浏览器打开nacos后台,新建配置文件,打开mysql的nacos库查看config-info表中是否保存了数据

 持久化配置完成后,开始集群!

这里模拟集群(实际上是伪集群,在一台服务器上起三个Nacos服务)

找到/nacos/cluster.conf.example文件,将其改名为conf/cluster.conf

并将其中的内容更改为:

  1. 192.168.40.139:8848
  2. 192.168.40.139:8849
  3. 192.168.40.139:8850

然后创建一个文件夹nacos_cluster

复制三份nacos并重命名至该文件夹中

并将他们application.properties中的端口号分别改为:

8848

8849

8850

然后分别启动测试:

 

 

 启动成功后,开始安装nginx:

nginx是使用C语言编写的,如同运行java程序需要jdk的环境一样,运行nginx需要C语言的环境

使用yum命令下载nginx环境依赖:

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

(注:yum安装出现Error downloading packages: libcom_err-devel-1.42.9-19.el7.x86_64: [Errno 25…的解决方法

执行vi /etc/sysconfig/network-scripts/ifcfg-ens33打开ifcfg-ens33文件,将BOOTPROTO设置为dhcp

然后重启网卡,执行命令

systemctl restart network)

依赖安装完毕后,下载nginx

执行:wget -c https://nginx.org/download/nginx-1.12.0.tar.gz 下载

解压安装包:tar -zxvf nginx-1.12.0.tar.gz

这里要注意,解压完之后要配置nginx的安装包

cd nginx-1.12.0

./configure --prefix=/usr/local/nginx

然后编译并安装

make && make install

启动前的最后一步,配置nginx的反向代理

在nginx的conf目录下编辑nginx.conf文件

在location中添加proxy_pass http://nacos;

这里的配置相当于告诉nginx需要代理的服务,通信协议为http,nacos是自定义的服务名

然后再server上面定义这个nacos

必须使用upstream定义,否则nginx不会识别。并且指定代理服务的地址和端口号

准备就绪,启动nginx!

在nginx的sbin目录下执行:./nginx

在浏览器访问nginx服务器ip测试代理

 访问成功,关于nacos集群搭建到这里落幕。

Nacos开机自启动

最后再说一下如何在linux上配置Nacos开机自启动

1.添加nacos.service文件

执行下面命令:

vim /lib/systemd/system/nacos.service

然后进入插入模式,添加如下内容:

  1. [Unit]
  2. Description=nacos
  3. After=network.target
  4. [Service]
  5. Type=forking
  6. ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
  7. ExecReload=/usr/local/nacos/bin/shutdown.sh
  8. ExecStop=/usr/local/nacos/bin/shutdown.sh
  9. PrivateTmp=true
  10. [Install]
  11. WantedBy=multi-user.target

2.修改nacos的startup.sh

vim /usr/local/nacos/bin/startup.sh

修改JAVA_HOME路径并注销之后的3行配置

 3.设置开机启动:

systemctl daemon-reload        #重新加载服务配置
systemctl enable nacos.service  #设置为开机启动
systemctl start nacos.service   #启动nacos服务
systemctl stop nacos.service    #停止nacos服务

到这里,关于nacos组件的入门使用介绍完毕!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/315299
推荐阅读
相关标签
  

闽ICP备14008679号