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
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
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 {
}