先回顾一下Spring Cloud
在学习Spring Cloud的时候相信大家都使用过Eureka和Config
- Eureka:注册中心
- Config:配置中心
- 使用Eureka和Config时需要自己搭建一个服务而且这两者的英文界面不是很友好,无论是Eureka和Config都需要自己搭建一台服务,配置比较繁琐
- 以上两大组件可能随时会面临停更的问题,比如Eureka已经停更了谁知道后面的组件会不会如此呢?
使用Spring Cloud Alibaba中的Nacos
用过Nacos的都说Nacos爽,使用Nacos时不需要自己搭建服务,因为阿里已经提供好了服务,只要启动即可
Nacos
相当于Spring Cloud中的服务注册Eureka
、消息总线Spring Bus
、配置中心Config
三大组件
使用Docker快速安装Nacos
docker pull nacos/nacos-serve
# 单机版部署
docker run -d -p 8848:8848 -e MODE=standalone -e NACOS_SERVER_IP=服务地址 nacos/nacos-server
Nacos默认的端口号是8848
在浏览器输入:http://ip地址:8848/nacos/
就可以访问nacos了
分布式配置中心
在Spring Cloud中我们需要在git上先拉取配置,然后配置中心客户端在配置中心服务端上拉取配置,要实现数据动态刷新还需要使用Spring Bus以及RabbitMQ
过程可是相当繁琐
在Nacos中使用分布式配置中心过程就会简单需要新增命名空间默认为public下,根据需要添加分组
- namespace相当于开发环境
- group相当于项目
- Data Id相当于工程
应用和配置中心的数据同步有以下三种模式:pull、push、混合模式
应用在配置中心上拉取配置,在配置中心上数据发生更改后,主动推送配置数据到指定的应用中
需要在引用配置文件的类上方添加
@RefreshScope
注解
代码示例如下:
这里使用的是Dubbo服务进行远程调用,我们将Dubbo的配置文件放到配置中心上进行集中化管理
生产者yml文件
需要指定Nacos服务地址,命名空间默认为public
,组名默认为DEFAULT_GROUP
,前缀,默认为${spring.application.name}
,环境名有环境名添加环境名
,后缀名yaml也就是yml
读取配置中心上文件的读取规则:
p
r
e
f
i
x
−
{prefix}-
prefix−{spring.profiles.active}-${file-extension}
分别对应的是应用名–环境名–文件后缀名
当active为空时对应的是:
p r e f i x − {prefix}- prefix−{file-extension}
spring:
application:
name: dubbo-provider
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
config:
server-addr: 192.168.66.121:8848
namespace: 2135aba9-1d1d-4477-b7bc-ca0a7c45ed58
group: DEFAULT_GROUP
prefix: ${spring.application.name}
file-extension: yaml
profiles:
active: dev
注意事项:以application命名的配置文件优先级比较低并不能直接在配置中心上拉取配置,还可能会出现项目启动不了的情况。我们应该使用比application的优先级更高的配置文件也就是
bootstrap
但是在Spring Cloud中要想使用bootstrap就要引入spring-cloud-starter-bootstrap
起步依赖
在Spring2.0之后可能出现包重复引用的问题,出现这个bug不要慌,添加allow-bean-definition-overriding: true allow-circular-references: true
就可以解决
生产者提供服务:
@DubboService(timeout = 5000,
methods = {@Method(name = "index",retries = 2)},
cluster = "failfast")
public class PaymentServiceImpl implements IPaymentService {
@Override
public String index() {
return "支付成功";
}
}
消费者yml文件:
spring:
application:
name: dubbo-consumer-order
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
config:
server-addr: 192.168.66.121:8848
namespace: 2135aba9-1d1d-4477-b7bc-ca0a7c45ed58
group: DEFAULT_GROUP
prefix: ${spring.application.name}
file-extension: yaml
profiles:
active: dev
编写控制器进行远程调用:
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/index")
public String index(){
String order = orderService.order();
return order;
}
}