看这篇文章前可以先看我的之前文章 springboot集成nacos
创建2个springcloud服务cloud-order-service和cloud-user-service,并导入pom包
注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
0.2.2.RELEASE
在bootstrap.properties中配置nacos.config.server的地址以及spring.application.name
spring.application.name=cloud-order-service
server.port=8803
# 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置中心-指定命名空间,nacos控制台创建的
spring.cloud.nacos.config.namespace=8bdc6474-18c5-4841-a14d-d09d0957c948
# 指定配置文件后缀
spring.cloud.nacos.config.file-extension=properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分,在 Nacos Spring Cloud 中,dataId 的完整格式:
- ${prefix}-${spring.profile.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profile.active 即为当前环境对应的 profile,当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型
spring.application.name=cloud-user-service
server.port=8804
# 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置中心-指定命名空间,nacos控制台创建的
spring.cloud.nacos.config.namespace=8bdc6474-18c5-4841-a14d-d09d0957c948
# 指定配置文件后缀
spring.cloud.nacos.config.file-extension=properties
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
我这里使用了一个namespace让springcloud的服务配置放在了dev的namespace下面
新建一个CloudOrderController获取配置文件的值,通过Spring原生注解 @Value 注解设置属性值,通过 SpringCloud 原生注解@RefreshScope 实现配置自动更新
@Slf4j
@RefreshScope
@RestController
@RequestMapping("/cloudOrder")
public class ClourOrderController extends BaseController {
@Value("${nacos.test:132}")
String nacosTest;
@GetMapping("/getProperties")
public Results getProperties() {
return succeed(nacosTest);
}
}
同理新建一个CloudUserController获取配置文件的值
@Slf4j
@RefreshScope
@RestController
@RequestMapping("/cloudUser")
public class CloudUserController extends BaseController {
@Value("${nacos.test:132}")
String nacosTest;
@GetMapping("/getProperties")
public Results getProperties() {
return succeed(nacosTest);
}
}
Nacos控制台增加配置参数,注意springcloud的配置参数必须是properties或者yml格式,在新建配置参数Data ID的时候必须增加后缀.properties或者.yml才能获取到
浏览器访问 http://localhost:8803/cloudOrder/getProperties 就可以获取到nacos配置中心的值
pom增加配置
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
0.2.2.RELEASE
bootstrap.properties增加注册中心配置
spring.application.name=cloud-order-service
server.port=8803
# 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置中心-指定命名空间
spring.cloud.nacos.config.namespace=8bdc6474-18c5-4841-a14d-d09d0957c948
# 指定配置文件后缀
spring.cloud.nacos.config.file-extension=properties
# 注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定命名空间
spring.cloud.nacos.discovery.namespace=8bdc6474-18c5-4841-a14d-d09d0957c948
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
我这里也指定了命名空间,配置好了后启动服务就可以在服务列表找到新加的服务
新增接口调用 cloud-order-service服务调用cloud-user-servicfe接口获取用户名
通过 SpringCloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能,注册一个RestTemplate实例用以发送请求,给RestTemplate实例添加@LoadBalanced注解,开启与Ribbon的集成用于负载均衡
@EnableDiscoveryClient
@SpringBootApplication
public class CloudOrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CloudOrderServiceApplication.class, args);
}
@PostConstruct
void setDefaultTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
新建CloudUserController接口,创建一个获取用户名的接口
@Slf4j
@RefreshScope
@RestController
@RequestMapping("/cloudUser")
public class CloudUserController extends BaseController {
@Value("${nacos.test:132}")
String nacosTest;
@GetMapping("/getProperties")
public Results getProperties() {
return succeed(nacosTest);
}
/**
* 获取用户名
* @return
*/
@GetMapping("/getUserName")
public String getUserName() {
return "lockie";
}
}
新建一个CloudOrderController,创建一个获取订单接口,里面调用cloud-user-service的getUserName接口
@Slf4j
@RefreshScope
@RestController
@RequestMapping("/cloudOrder")
public class ClourOrderController extends BaseController {
@Value("${nacos.test:132}")
String nacosTest;
@Autowired
private RestTemplate restTemplate;
private final static String USER_SERVICE = "cloud-user-service";
private final static String GET_USER_NAME = "/cloudUser/getUserName";
@GetMapping("/getProperties")
public Results getProperties() {
return succeed(nacosTest);
}
/**
* 获取订单信息
* @return
*/
@GetMapping("/getOrder")
public Results getOrder() {
// 获取用户名
String userName = restTemplate.getForObject("http://" + USER_SERVICE + GET_USER_NAME, String.class);
Order order = new Order();
order.setId(1);
order.setUserName(userName);
order.setCreateTime(new Date());
return succeed(order);
}
}
浏览器访问http://localhost:8803/cloudOrder/getOrder 获取订单信息,里面调用了cloud-user-service获取用户名