什么是nacos?
首先看下官方的简介:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
nacos的特性
服务发现和服务健康监测动态配置服务动态DNS服务服务及元数据管理nacos脑图
nacos的安装
对于nacos的安装,本文不作详细介绍,因为官网文档里面已经介绍的十分全面了,若有需要可以直接参考官网快速开始。安装完成之后,打开nacos后台管理页面如下:
可以发现左侧菜单有我们今天需要用到的配置管理和服务管理选项。
使用nacos作注册中心和配置中心
在使用nacos之前,本人所在公司注册中心使用的是eureka,配置中心是携程的apollo。nacos由国内公司阿里巴巴开源出品,集成了注册中心和配置中心两大功能,并且有强大的社区支持,符合国人使用习惯。
创建spring cloud项目
在父工程下创建module,创建服务提供者cloud-nacos-provider和服务消费者cloud-nacos-consumer,依赖信息如下:
org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.cloud spring-cloud-starter-openfeign 2.0.0.RELEASEcom.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 2.2.1.RELEASEcom.yezi cloud-nacos-api 1.0-SNAPSHOTcompile
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: /7/22 14:17 */@EnableFeignClients(basePackages = {"com.yezi"})@EnableDiscoveryClient@SpringBootApplicationpublic 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: /7/22 15:01 */@RefreshScope@RestControllerpublic 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: 8082name: 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: ymldiscovery: 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: /7/22 15:03 */@RestControllerpublic 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: /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作为配置中心,验证通过。
来源:/articles/auIvemi
欢迎关注微信公众号【慕容千语】