springboot整合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。
    200915.naocs.namespace.png
  • 创建配置。
    200915.naocs.dataid.png
  • 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 {
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值