新建springboot 项目boot-user-service,boot-order-service服务
首先Nacos官网下载nacos到本地,解压后进入/bin目录,点击windows启动即可启动
本地数据库创建nacos数据库,然后运行/conf/nacos-mysql.sql 脚本
修改windows启动配置 /bin/startup.cmd,nacos默认为集群模式,本地启动时需要修改为单机模式。
双击/bin/startup.cmd
windows启动后浏览器输入http://localhost:8848/nacos 如果能够访问到就说明成功,Nacos默认账户和密码都是nacos
增加pom依赖:
注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
<!--nacos配置管理功能-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
<!--nacos-服务发现功能依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
增加配置文件:
boot-user-service配置文件application.properties配置内容
spring.application.name=boot-user-service
server.port=8801
# nacos配置地址
nacos.config.server-addr=127.0.0.1:8848
# nacos注册地址
nacos.discovery.server-addr=127.0.0.1:8848
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
boot-order-service配置内容:
spring.application.name=boot-order-service
server.port=8802
# nacos配置地址
nacos.config.server-addr=127.0.0.1:8848
# nacos注册地址
nacos.discovery.server-addr=127.0.0.1:8848
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
项目启动文件使用 @NacosPropertySource 加载 dataId 为 example 的配置源,并开启自动更新
boot-user-service启动类
@SpringBootApplication
@NacosPropertySource(dataId = "boot-user-service", autoRefreshed = true)
public class BootUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserServiceApplication.class, args);
}
@PostConstruct
void setDefaultTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
}
boot-order-service启动类
@SpringBootApplication
@NacosPropertySource(dataId = "boot-order-service", autoRefreshed = true)
public class BootOrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(BootOrderServiceApplication.class, args);
}
@PostConstruct
void setDefaultTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
}
OK,springboot服务集成Nacos配置就已经完成了,启动项目即可
配置中心:
进入nacos管理页面 - 配置管理 - 配置列表,分别增加boot-user-service和boot-order-service的配置参数
boot-order-service配置
配置好了后分别新建BootUserController和BootOrderController调用获取配置内容
BootUserController内容:
通过 Nacos 的 @NacosValue 注解设置属性值,示例中会加载配置中的值,如果没有则取到的值为123,启动自动刷新。
@Slf4j
@RestController
@RequestMapping("/bootUser")
public class BootUserController extends BaseController {
@NacosValue(value = "${nacos.test:123}", autoRefreshed = true)
String properties;
@RequestMapping("/getProperties")
public Results getProperties() {
return succeed(properties);
}
}
BaseController为自定义类方便为了返回json格式的数据,浏览器访问 http://localhost:8801/bootUser/getProperties
同理BootOrderController内容:
@Slf4j
@RestController
@RequestMapping("/bootOrder")
public class BootOrderController extends BaseController {
@NacosValue(value = "${nacos.test:123}", autoRefreshed = true)
String properties;
@RequestMapping("/getProperties")
public Results getProperties() {
return succeed(properties);
}
}
浏览器访问 http://localhost:8802/bootOrder/getProperties
注册中心
启动user和order项目后naocs控制台上服务列表并没有我们的服务
增加配置让项目启动的时候自动注册到nacos注册中心
/**
* @Description: Nacos服务启动自动注册配置
*/
@Configuration
public class NacosRegisterConfig {
@Value("${server.port}")
private int serverPort;
@Value("${spring.application.name}")
private String applicationName;
@NacosInjected
private NamingService namingService;
@PostConstruct
public void registerInstance() throws NacosException {
namingService.registerInstance(applicationName, "127.0.0.1",serverPort,"DEFAULT");
}
}
配置好了再次启动项目就可以看到2个服务注册到了服务列表
服务发现/调用
服务注册到了nacos后我们就可以相互调用,采用项目名称调用,order项目调用user项目的接口获取用户名
使用 @NacosInjected 注入 Nacos 的 NamingService 实例,并使用namingService获取提供boot-user-service服务的实例,通过restTemplate调用其getUser接口
boot-order-service 新建一个接口通过rest方式调用user服务
@Slf4j
@Service
public class UserServiceClient {
@NacosInjected
NamingService namingService;
private RestTemplate restTemplate = new RestTemplate();
private static final String USER_SERVICE = "boot-user-service";
private static final String GET_USER_NAME = "/bootUser/getUserName";
/**
* 获取用户名
* @return
*/
public String getUserName() {
try {
if (namingService != null) {
// 选择 bootuser-service 服务的一个健康实例
Instance instance = namingService.selectOneHealthyInstance(USER_SERVICE);
// 拼接请求url
String url = "http://" + instance.getIp() + ":" + instance.getPort() + GET_USER_NAME;
// 采用rest方式调用user-service服务获取用户名
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
return entity.getBody();
}
} catch (Exception e) {
log.error("query bootuser error", e);
}
return null;
}
}
order服务开启一个获取订单的接口
@Slf4j
@RestController
@RequestMapping("/bootOrder")
public class BootOrderController extends BaseController {
@Autowired
UserServiceClient userServiceClient;
@NacosValue(value = "${nacos.test:123}", autoRefreshed = true)
String properties;
@RequestMapping("/getProperties")
public Results getProperties() {
return succeed(properties);
}
/**
* 获取订单
* @return
*/
@GetMapping("/getOrder")
public Results getOrder() {
String userName = userServiceClient.getUserName();
Order order = new Order();
order.setId(1);
order.setUserName(userName);
order.setCreateTime(new Date());
return succeed(order);
}
}
首先浏览器直接调用user服务获取用户名
访问order服务接口,里面调用user服务获取用户名