一、SpringCloudAlibaba
1. SpringCloud netflix进入了维护模式
2. Spring Cloud Alibaba入驻Spring Cloud,替换Cloud相关的netflix组件
- 版本关系: nacos版本
二、服务注册中心
1. 安装部署
# 单机版nacos - 1.4.2
docker search nacos
docker pull nacos/nacos-server:1.4.2
# MODE=standalone:单机版
docker run --env MODE=standalone --name mynacos -d -p 9001:8848 nacos/nacos-server:1.4.2
docker exec -it first_nacos bash
# 通过 http://ip:9001/nacos 访问,登录密码默认nacos/nacos
http://60.205.229.31:9001/nacos
2. 服务入驻
- 两个 A服务,一个B 服务,一个注册中心
<!--web模块的两个依赖,这两个一般绑定在一起-->
<!--nacos注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
port: 8001
# 注册到Nacos的服务名
spring:
application:
name: nike-provider
# 服务注册的Nacos地址,不用写http
cloud:
nacos:
discovery:
server-addr: 60.205.229.31:9001
management:
endpoints:
web:
exposure:
include: '*'
# 主启动类:服务注册和发现功能
# import org.springframework.cloud.client.discovery.EnableDiscoveryClient
@EnableDiscoveryClient
3. 服务调用
@Configuration
public class RestTemplateConfig {
// import org.springframework.cloud.client.loadbalancer.LoadBalanced;
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
@RequestMapping("/consumer")
@RestController
public class ConfigController {
@Autowired
private RestTemplate restTemplate;
String targetUrl = "http://nike-provider";
@GetMapping("/info")
public String getInfo() {
return restTemplate.getForObject(targetUrl + "/provider/info", String.class);
}
}
三、服务配置中心
1. 配置中心
- 服务注册中心和配置中心都是nacos,如下为常见参数
namespace: 区分部署环境,默认为public,可以自定义prod,uat,development等,互相隔离
在项目中要用naocos控制台生成的uuid随机数
group: 区分不同的功能模块,默认为DEFAULT_GROUP,可自定义如crm,btob,msm
dataId: 具体的配置文件名称,
一般格式为{spring.application.name}-{spring.profile.active}.yaml
2. Client Server
<!--web模块,这两个一般绑定在一起-->
<!--引入nacos,一般都是注册中心和配置中心一起-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
// 主启动类
@EnableDiscoveryClient
2.1 配置文件
bootstrap.yaml
# 如下的内容必须放在bootstrap.yaml中
spring:
profiles:
active: prod
application:
name: erick-consumer
cloud:
nacos:
discovery:
server-addr: 60.205.229.31:9001 # 服务注册的Nacos地址,不用写http
namespace: f8117703-ca23-43f4-a4bf-f1395f377008 # 服务注册时候的命名空间
group: nike # 服务注册时候的分组
config:
server-addr: 60.205.229.31:9001 # 注册中心
namespace: f8117703-ca23-43f4-a4bf-f1395f377008 # 命名空间的uuid
file-extension: yaml
prefix: ${spring.application.name} # 配置文件前缀,
# 配置文件格式:erick-consumer-prod.yaml
group: nike
application.yaml
server:
port: 9001
management:
endpoints:
web:
exposure:
include: '*'
spring:
profiles: prod
测试类
- 在需要动态刷新的class或者bean上,添加@RefreshScope ,达到实时刷新的效果
import org.springframework.cloud.context.config.annotation.RefreshScope;
@RestController
@RequestMapping("/config")
@RefreshScope // 动态刷新
public class InfoController {
@Value("${name}")
private String name;
@Value("${password}")
private String password;
@GetMapping("/info")
public String getInfo() {
return name + password;
}
}