nacos学习笔记_01
1、关于nacos
请访问如下链接:https://www.jianshu.com/p/7da2e950162b
2、下载nacos客户端(不再做描述)
Nacos依赖于Java环境,所以必须安装Java环境。然后从官网下载Nacos的解压包,安装稳定版的,下载地址:https://github.com/alibaba/nacos/releases
3、启动
在bin/start.cmd中可以看到如下内容:
cluster表示集群部署时的启动方式,单应用启动时直接运行start.cmd会报错,在bin目录下打开cmd命令,通过如下方式启动:
start.cmd -m standalone
启动成功之后如下页面表示启动成功:
4、应用
搭建一个分布式项目,包含如下两个模块:
1> 服务提供模块 nacos_provide
2> 服务消费模块 nacos_consume
具体搭建步骤不在赘述,项目结构如下:
在父模块中添加如下maven依赖
```xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 关键 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
<!-- 这个需要为 true 热部署才有效 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 使用配置中心方式 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,
从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--feign 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入okhttp-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.1、服务提供者—服务注册与发现、配置中心使用简介
新建服务提供者nacos_provide,鼠标右键父项目,maven,Reimport,刷新maven依赖;
启动类配置:
@EnableSwagger2 //swagger文档配置,有兴趣的自行查阅学习
@EnableDiscoveryClient //核心,代表自己是一个客户端
@SpringBootApplication
添加配置文件bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件),内容如下:
server:
port: 9991
servlet:
context-path: /provide
spring:
application:
##代表Nacos Config中的Data ID
name: ak-nacos-provide
cloud:
nacos:
config:
##指定配置名为ak-nacos-provide的配置文件的后缀
file-extension: yaml
## nacos配置中心服务的地址
server-addr: localhost:8848
##配置服务发现地址,和配置中心地址区别开来
discovery:
server-addr: localhost:8848
打开nacos服务的客户端,在配置管理页面,点击右侧加号,新建 ak-nacos-provide.yaml配置文件,如下图所示:
配置格式要与项目中 spring.cloud.nacos.config.file-extension一致,建议配置信息在项目中通过提示输出后复制到此处,确保配置正确,编辑完点击发布,即可在配置管理中查看该配置。
新建测试类,测试是否可以拿到配置信息:
@RefreshScope//动态获取并实时刷新配置,必须在每一个可能刷新Bean的类加上该注解
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private ConfigurableApplicationContext ctx;
@Value("${url_address}")
private String urlAddress;
@Value("${data.url}")
private String dataUrl;
private Logger log = LoggerFactory.getLogger(this.getClass());
//直接通过ConfigurableApplicationContext获取配置信息
@RequestMapping(value = "/test/{id}",method = RequestMethod.POST)
public String getMsg(@PathVariable Integer id) {
return "msg "+ id + " >> " + ctx.getEnvironment().getProperty("server.port");
}
@RequestMapping(value = "getConfigInfo",method = RequestMethod.POST)
public String getConfigInfo(){
log.info("服务调用!-------------------------");
return urlAddress + " >> " +serverPort+" >> "+dataUrl;
}
}
测试结果如下,可以成功拿到配置信息:
打开nacos客户端中的服务管理–服务列表,即可查看到注册的服务信息
4.2、服务消费者—多项目共享配置、服务注册与发现、feign客户端调用简介
新建服务提供者nacos_consume,鼠标右键父项目,maven,Reimport,刷新maven依赖;
启动类配置:
@EnableSwagger2 //swagger文档配置,有兴趣的自行查阅学习
@EnableDiscoveryClient //核心,代表自己是一个客户端
//代表开启feign客户端调用,value表示客户端接口所在包
@EnableFeignClients(value = "com.akproject.nacosconsume.feign")
@SpringBootApplication
添加配置文件bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件),内容如下:
server:
port: 9992
spring:
application:
##服务实例名称以及配置文件id
name: ak-nacos-consume
cloud:
nacos:
config:
##配置文件后缀
file-extension: yaml
##配置中心服务的地址
server-addr: localhost:8848
##指定共享配置的dataId,多个文件用,隔开
##该方式只能获取同一 组名 下的配置信息
shared-configs: enjoyConfig.yaml
##指定共享配置文件,支持自动刷新
refreshable-dataids: enjoyConfig.yaml
##实现不同组别中的配置文件共享
ext-config:
## - 表示可以添加多个不同组下的配置文件
- data-id: enjoyConfigOtherGroup.yaml
group: OtherGroup
refresh: true
##自动刷新
refresh-enabled: true
##服务注册地址
discovery:
server-addr: localhost:8848
##此配置表述输出feign包调用时的日志
logging:
level:
com.akproject.nacosconsume.feign: debug
##配置feign调用使用okhttp
feign:
##禁用httpclient
httpclient:
enable: false
##配置使用okhttp
okhttp:
enable: true
##Feign压缩配置,压缩数据,减少通信中的性能损耗,默认是禁止的
compression:
request:
##启用压缩
enable: true
##压缩的类型
mime-types: text/xml,application/xml,application/json
##最小压缩值的标准
min-request-size: 2048
##启用压缩
response: true
feign配置类:
@Configuration
public class FeignConfiguration {
/**
* 日志配置
* @return
*/
@Bean
Logger.Level frignLoggerLevel(){
//NONE, 不输出日志
//BASIC, 只输出请求方法的URL和响应的状态码以及接口执行的时间
//HEADERS, 将BASIC信息和请求头信息输出
//FULL; 输出完整的请求信息
return Logger.Level.FULL;
}
/**
* Feign配置超时时间配置
*/
@Bean
public Request.Options options(){
// 第一个参数:配置连接超时时间 默认是10 * 1000
// 第二个参数:读取超时时间 默认是 60 * 1000
return new Request.Options(5000,10000);
}
}
feign客户端:
//value 代表服务实例信息,即就是Data Id
//path 代表该服务对应的controller的RequestMapping地址,包括contextPath路径
//configuration 日志配置类
@FeignClient(value = "ak-nacos-provide",
path = "/provide/test",
configuration = FeignConfiguration.class)
public interface NacosConsumeFeign {
@RequestMapping(value = "getConfigInfo",method = RequestMethod.POST)
public String getConfigInfo();
}
编辑测试类,通过feign调用,结果如下:
@RefreshScope//动态获取并实时刷新配置,必须在每一个可能刷新Bean的类加上该注解
@RestController
@RequestMapping("testGetServiceInfo")
public class TestGetServiceInfoController {
@Autowired
private NacosConsumeFeign nacosConsumeFeign;
/**
* 获取服务提供者的信息
*
* @return
*/
@RequestMapping(value = "getConfigInfoFromProvideUseFeign", method = RequestMethod.POST)
public String getConfigInfoFromProvideUseFeign() {
return consumeUrl + "获取服务提供数据通过Feign:" + nacosConsumeFeign.getConfigInfo();
}
}
配置共享:
请参考上面bootstrap.yml文件的共享配置说明
1> 新建enjoyConfig.yaml配置
2> 新建OtherGroup组名下的enjoyConfigOtherGroup.yaml配置
测试:
package com.akproject.nacosconsume.controller;
import com.akproject.nacosconsume.feign.NacosConsumeFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RefreshScope//动态获取并实时刷新配置,必须在每一个可能刷新Bean的类加上该注解
@RestController
@RequestMapping("testGetServiceInfo")
public class TestGetServiceInfoController {
@Value("${consume.url}")
private String consumeUrl;
//这个是同一组名下共享配置中的属性
@Value("${dataStr}")
private String dataStr;
/**
* 获取共享配置信息
*
* @return
*/
@RequestMapping(value = "getConfigInfoFromEnjoy", method = RequestMethod.POST)
public String getConfigInfoFromEnjoy() {
return "获取共享配置信息:" + dataStr;
}
//这个是不同组名下共享配置中的属性
@Value("${enjoyConfigOtherGroup}")
private String enjoyConfigOtherGroup;
//获取application.yml文件下的属性
@Value("${testData}")
private String testData;
/**
* 获取不同组名下共享配置信息
*
* @return
*/
@RequestMapping(value = "getConfigInfoFromEnjoyOtherGroup", method = RequestMethod.POST)
public String getConfigInfoFromEnjoyOtherGroup() {
return "获取共享配置信息:" + enjoyConfigOtherGroup + " >> " +testData;
}
}
请自行测试。。。
4.3、说明
通过@Value注解将nacos配置中心中的配置信息注入的类,都要在类上加@RefreshScope,其作用是:动态获取并实时刷新配置,修改配置信息后不用重启项目即可获取最新配置。