springboot整合nacos

it2023-02-13  81

Nacos简介

nacos简介。

Server

下载最新版本、启动server。参考文档。默认的本地admin地址:http://127.0.0.1:8848/nacos

Client

引入依赖

house-common中引入nacos依赖。 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>

应用上下文配置外部化

house-api为例。bootstrap.properties配置如下。如HOUSE_ENV=dev,则加载 house-api-application.yaml, house-base-mysql.yaml 。约定参考。 spring.application.name=house-api spring.profiles.active=api-application,base-mysql spring.cloud.nacos.config.namespace=${HOUSE_ENV} spring.cloud.nacos.config.group=house spring.cloud.nacos.config.server-addr=${NACOS_ADDR} spring.cloud.nacos.config.prefix=house spring.cloud.nacos.config.file-extension=yaml nacos admin页面创建namespace。创建配置。house-api-application.yaml: server: port: 8081 servlet: context-path: / house-base-mysql.yaml。 spring: datasource: name: development url: jdbc:mysql://localhost:3306/house?characterEncoding=utf8 username: root password: root # 使用druid数据源 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20 mybatis: mapper-locations: classpath:mapper/*.xml #对应mapper映射xml文件的所在路径 # type-aliases-package: com.babyjuan.house.repository.mysql.entity # 对应实体类的路径非必须 #pagehelper分页插件 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql

注意:Nacos配置带中文,需要启动参数加上utf-8编码。

java -Dfile.encoding=utf-8 -jar .\house-api-0.0.1-SNAPSHOT-exec.jar

业务配置外部化

house-common中实现初始化和监听更新的Nacos配置父类。 public abstract class BaseNacoConfig { protected Logger logger = LoggerFactory.getLogger(getClass()); @Value("${spring.cloud.nacos.config.server-addr}") private String serverAddr; @Value("${spring.cloud.nacos.config.namespace}") private String namespace; @Value("${spring.cloud.nacos.config.group}") private String group; private ConfigService configService; @PostConstruct public void init() throws Exception { Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); properties.put(PropertyKeyConst.NAMESPACE, namespace); configService = NacosFactory.createConfigService(properties); initContent(fetchContent()); configService.addListener(dataId(), group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { try { changeContent(fetchContent()); } catch (NacosException e) { logger.error("{} change error.", dataId()); } } @Override public Executor getExecutor() { return null; } }); } private String fetchContent() throws NacosException { String content = configService.getConfig(dataId(), group, 5000); logger.info("fetch data, dataId: {}, content: {}", dataId(), content); return content; } public abstract String dataId(); public abstract void initContent(String content); public abstract void changeContent(String content); } house-task中监听开关的变更,控制运行。 @Configuration public class CrawlerSwitchConfig extends BaseNacoConfig { private volatile boolean on; @Resource(name = "secondHandCrawlerCommandImpl") private CrawlerCommand crawlerCommand; @Override public String dataId() { return "house-task-spider-switch"; } @Override public void initContent(String content) { on = BooleanUtils.toBoolean(content); } @Override public void changeContent(String content) { boolean newStatus = BooleanUtils.toBoolean(content); if (newStatus && !on) { crawlerCommand.start(1); } else if (!newStatus && on) { crawlerCommand.stop(); } else { logger.info("crawler status unchange, {} -> {}", on, newStatus); } on = newStatus; } public boolean on() { return on; } } @Component public class SpiderTask { protected Logger logger = LoggerFactory.getLogger(getClass()); @Resource(name = "secondHandCrawlerCommandImpl") private CrawlerCommand secondHandCrawlerCommand; @Resource(name = "shHouseDealCrawlerCommandImpl") private CrawlerCommand shHouseDealCrawlerCommand; @Autowired private CrawlerSwitchConfig crawlerSwitchConfig; @Scheduled(fixedDelay = 3 * 1000) public void shHouse() { if (!crawlerSwitchConfig.on()) { return; } secondHandCrawlerCommand.start(1); } }

Dubbo配置外部化

参考。house-api,house-rest为例。

provider

house-api-provider中的dubbo配置移到house-api-application.yaml。 server: port: 8081 servlet: context-path: / dubbo: application: name: ${spring.application.name} protocol: name: dubbo port: 28081 registry: address: zookeeper://127.0.0.1:2181 timeout: 60000 protocol: zookeeper 接口实现改用dubbo注解暴露。 import com.alibaba.dubbo.config.annotation.Service; @Service public class SecondHandHouseServiceImpl implements SecondHandHouseService { } 指定扫描路径。 @SpringBootApplication @EnableDubbo(scanBasePackages = "com.babyjuan.house.api.service") public class HouseApiApplication implements WebMvcConfigurer { }

consumer

house-rest-consumer中的dubbo配置移到house-rest-application.yaml。 server: port: 8080 servlet: context-path: /house dubbo: application: name: ${spring.application.name} protocol: name: dubbo port: 28080 registry: protocol: "zookeeper" address: zookeeper://127.0.0.1:2181 timeout: "60000" consumer: check: false 使用注解引用dubbo接口。 import com.alibaba.dubbo.config.annotation.Reference; public class SecondHandHouseController { @Reference private SecondHandHouseService secondHandHouseService; } 开启dubbo注解。 @EnableDubbo public class HouseGatewayApplication implements WebMvcConfigurer { }
最新回复(0)