springboot集成Nacos的配置中心,注册中心

新建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服务获取用户名

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值