Spring Cloud整合nacos使用
一、启动配置管理(自动加载配置)
1.添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.0.1.0</version>
</dependency>
<!--2020.0.0 版本不在默认加载bootstrap 文件,需引入一下依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.7</version>
</dependency>
2.增加bootstrap.yml配置
spring:
application:
# 应用名称
name: service-provider
profiles:
# 环境配置
active: dev
cloud:
nacos:
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- dataId: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
refresh: true #经修正 不加这个无法热更新共享配置
-
注:在 Nacos Spring Cloud 中,dataId 的完整格式如下:
-
1.prefix 默认为
spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。 -
2.spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成
${prefix}.${file-extension}
- 3.file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
${prefix}-${spring.profiles.active}.${file-extension}
3.使用@RefreshScope
注解实现配置自动更新
@Data
@Component
@RefreshScope
public class Properties {
@Value("${testName}")
public String name;
}
4.在nacos配置管理中新增dataId与上面一致的配置
二、启动服务发现
1.服务提供者
(1)添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
</dependency>
(2)application.yml中增加配置
server:
port: 88
spring:
application:
# 应用名称
name: service-provider
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
(3)在启动类添加@EnableDiscoveryClient
注解开启服务注册发现功能
(4)controller方法
@RestController
public class TestController {
@RequestMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
2.服务消费者
(1)添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
</dependency>
<!-- 2020.0.0 版本去除了 Ribbon,需手动引入loadbalancer,解决nacos消费者服务访问提供者服务时报错java.net.UnknownHostException-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.1</version>
</dependency>
(2)application.yml中增加配置
server:
port: 8080
spring:
application:
# 应用名称
name: service-consumer
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
(3)启动类
添加@EnableDiscoveryClient
注解开启服务注册发现功能,并给 RestTemplate 实例添加 @LoadBalanced 注解
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
(4)controller方法
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
(5)访问http://localhost:8080/echo/2018
(6)nacos服务管理
三、新版本application.yml设置配置中心及服务发现
spring:
application:
# 应用名称
name: service-consumer
cloud:
nacos:
#nacos地址
serverAddr: 127.0.0.1:8848
config:
import:
#nacos配置中心的dataId(可以不用带后缀名)
- nacos:${spring.application.name}
四、拓展配置
五、openFeign
注:openFeign可以将提供者提供的RESTful服务伪装为接口进行消费,消费者只需使用“feign接口+注解”的形式即可直接调用提供者提供的RESTful服务,而无需在使用RestTemplate。
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2、启动类
添加注解@EnableFeignClients
3、service类
@FeignClient(value = "service-provider",path = "/echo")
public interface OpenFeignService {
@GetMapping("/{string}")
String echo(@PathVariable("string") String string);
}
4、controller
@RestController
@RequestMapping("test")
public class OpenFeignController {
@Autowired
private OpenFeignService openFeignService;
@GetMapping("echo/{string}")
public String test(@PathVariable("string") String string) {
return openFeignService.echo(string);
}
}
5、调用结果
6、其他配置
feign:
client:
config:
#全局配置
default:
connectTimeout: 5000 # 连接超时时间,单位毫秒
readTimeout: 5000 # 读取超时时间,单位毫秒
#指定服务配置
openfeign-demo:
connectTimeout: 5000
readTimeout: 5000
#请求响应压缩
compression:
request:
enabled: true
#压缩媒体类型
mime-types: text/xml,application/xml,application/json
#最小请求阈值长度
min-request-size: 2048
response:
enabled: true
#设置远程调用底层实现技术
okhttp:
enabled: true
注:设置远程调用底层实现技术为okhttp时,需要引入okhttp的相关依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
五、Gateway(网关)
1、添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注:spring-cloud-starter-gateway与spring-boot-starter-web不兼容,不建议同时存在
2、配置式路由
在application.yml文件中添加配置
#配置式路由
spring:
cloud:
gateway:
routes:
#路由的ID
- id: taobao_route
#匹配后提供服务的路由地址
uri: https://www.taobao.com
predicates:
#断言,路径相匹配的进行路由
- Path=/tb
#在设置时间之后可以访问
- After=2024-01-20T17:42:47.789-07:00
#在设置时间之前可以访问
- Before=2025-01-20T17:42:47.789-07:00
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Path=/s
#在设置时间之间可以访问
- Between=2024-01-20T17:42:47.789-07:00, 2025-01-21T17:42:47.789-07:00
#权重断言工厂(group,weight),同组之中80%访问该路由
- Weight=group1, 8
- id: cookie_route
uri: https://example.org
predicates:
#匹配cookie(key,value(支持正则表达式))
- Cookie=key,value
#匹配请求头(key,value(支持正则表达式))
- Header=X-Request-Id, \d+
#匹配请求的Host
- Host=**.somehost.org,**.anotherhost.org
#匹配请求方式
- Method=GET,POST
#匹配请求参数(key,value(支持正则表达式))或(key)
- Query=key,value
- Query=key
#权重断言工厂(group,weight),同组之中20%访问该路由
- Weight=group1, 2
#匹配可以访问的远程地址
- RemoteAddr=192.168.1.1/24
#匹配请求头的X-Forwarded-For
- XForwardedRemoteAddr=192.168.1.1/24
#过滤器
filters:
#添加请求头
- AddRequestHeader=X-Request-red, blue
#当未出现过时才能添加请求头,即如果请求头中已经存在了,则不再继续添加(gateway4以上版本支持)
- AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green
#添加请求参数
- AddRequestParameter=red, blue
#添加相应头
- AddResponseHeader=X-Response-Red, Blue
#熔断器(需要添加spring-cloud-starter-circuitbreaker-reactor-resilience4j依赖)
- name: CircuitBreaker
args:
name: myCircuitBreaker
#发生熔断后执行服务降级
fallbackUri: forward:/inCaseOfFailureUseThis
#请求uri添加前缀(如:/hello->/mypath/hello)
- PrefixPath=/mypath
#移除URI中指定数量的前缀
- StripPrefix=2
#重写URI路径,将/red/blue替换为/provider/depart
- RewritePath=/red/blue, /provider/depart
#开启Gateway在注册中心进行服务发现的功能,默认为false
discovery:
locator:
enabled: true
#将503状态码转换为404
loadbalancer:
use404: true
#全局跨域处理配置
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedHeaders: '*'
allowedMethods:
- GET
- POST
3、api式路由
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route("jd_route",predicateSpec -> predicateSpec.path("/jd").uri("https://jd.com"))
.build();
}
}
六、Sentinel(熔断机制)
1、下载并启动Sentinel 控制台
2、添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3、application.yml中增加配置
spring:
cloud:
#sentinel相关配置
sentinel:
#开启饥饿加载
eager: true
transport:
#开启一个与dashboard通信的进程
port: 8719
dashboard: localhost:8888