什么是nacos?
首先看下官方的简介:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
官方地址:nacos.io/zh-cn/
nacos的特性
- 服务发现和服务健康监测
- 动态配置服务
- 动态DNS服务
- 服务及元数据管理
nacos脑图
nacos的安装
对于nacos的安装,本文不作详细介绍,因为官网文档里面已经介绍的十分全面了,若有需要可以直接参考官网快速开始。安装完成之后,打开nacos后台管理页面如下:
可以发现左侧菜单有我们今天需要用到的配置管理和服务管理选项。
使用nacos作注册中心和配置中心
在使用nacos之前,本人所在公司注册中心使用的是eureka,配置中心是携程的apollo。nacos由国内公司阿里巴巴开源出品,集成了注册中心和配置中心两大功能,并且有强大的社区支持,符合国人使用习惯。
创建spring cloud项目
在父工程下创建module,创建服务提供者cloud-nacos-provider和服务消费者cloud-nacos-consumer,依赖信息如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.yezi</groupId>
<artifactId>cloud-nacos-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
cloud-nacos-provider
创建启动类
package com.yezi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @Description:
* @Author: yezi
* @Date: 2020/7/22 14:17
*/
@EnableFeignClients(basePackages = {"com.yezi"})
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
@EnableDiscoveryClient将服务注册到注册中心
@EnableFeignClients(basePackages = {"com.yezi"})本文使用了feign,开启feign包扫描
服务提供api
package com.yezi.controller;
import com.yezi.api.ProviderApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:
* @Author: yezi
* @Date: 2020/7/22 15:01
*/
@RefreshScope
@RestController
public class ProviderApiController implements ProviderApi {
@Value("${name:123}")
private String name;
@Override
public String say(@PathVariable("msg") String msg) {
System.out.println("【---------from---------】" + msg);
return "hello,consumer1";
}
@GetMapping("/config")
public String config() {
System.out.println("【---------from---------】" + name);
return name;
}
}
@RefreshScope 局部刷新注解,开启实时更新配置信息
@Value("${name:123}") 最常用的配置信息注入直接,默认为123,如果配置文件有信息,则从配置文件获取。本文本地application.yml中没有这个属性,在配置中心中放置name配置
在配置中心创建配置信息
nacos的配置data id默认以服务的spring.application.name
加上.yml
,因此这里创建2个配置文件,分别为nacos-provider.yml、nacos-consumer.yml。
nacos-provider.yml内容:
server:
port: 8082
name: y好卡机SD卡
nacos-consumer.yml内容:
server:
port: 8081
配置bootstrap.yml
创建bootstrap.yml
spring:
application:
name: nacos-provider
cloud:
nacos:
config:
enabled: false
server-addr: 192.168.18.244:8848
file-extension: yml
discovery:
server-addr: 192.168.18.244:8848
config.enabled 是否开启使用配置中心配置
config.server-addr 配置中心地址,也就是nacos地址
discovery.server-addr 注册中心地址(nacos地址)
笔者这里一开始用的application.yml,发现配置中心的数据没有生效,查看官方之后发现官网直接使用的bootstrap.yml然后就生效了。所以这里一定注意要使用bootstrap.yml。bootstrap.yml与application.yml两者区别如下:
-
bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
-
application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
由此知道bootstrap.yml 先于 application.yml 加载,使用spring cloud的时候,配置信息一般是从配置中心加载的,因此,把配置中心信息放在 bootstrap.yml,用来加载真正需要的配置信息。
创建config文件夹
在resources目录下创建config目录,在config目录中创application.yml配置文件,这里创建配置文件的目的是用作本地配置,当config.enabled=false时,将不会去读取配置中心细心,会直接读取config下配置文件信息。
cloud-nacos-consumer
服务消费者与提供者所有的文件模式是一样的,这里只提供一个消费者的延时controller:
package com.yezi.controller;
import com.yezi.api.ProviderApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:
* @Author: yezi
* @Date: 2020/7/22 15:03
*/
@RestController
public class ConsumerController {
@Autowired
private ProviderApi providerApi;
@GetMapping("/say")
public String test() {
return providerApi.say("hello,provider");
}
}
这里解释下为什么要把api层单独提供一个module,在使用feign的时候,服务消费者要使用服务提供者的api,需要构造一个与提供者一个一样的feign的client,为了节省这部分代码,把这部分单独提取一个module,在provider和consumer两边引入即可。
api信息如下:
package com.yezi.api;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @Description:
* @Author: yezi
* @Date: 2020/7/22 16:35
*/
@FeignClient("nacos-provider")
public interface ProviderApi {
@GetMapping("/provider/say/{msg}")
String say(@PathVariable("msg") String msg);
}
启动服务验证结果
查看nacos配置列表,如下
发现2个服务都注册到nacos中心。
测试一下用为注册中心服务调用:
访问consumer服务http://127.0.0.1:8081/say地址,8081端口是我们在配置中心指定的,本地端口为8083,得到如下结果:
nacos作为注册中心,验证通过。
测一下用作配置中心:
访问provider服务 http://127.0.0.1:8082/config地址,8082端口是我们在配置中心指定的,本地端口为8084,配置中心中name配置为yezi,得到如下结果:
nacos作为配置中心,验证通过。