网上关于 Nacos 的使用介绍已经很多了,又是国产确实也好用。关于 Consul 的也很多,不过都是与 Spring Boot 集成的。此文讲讲 Consul 与 Solon 集成与简单使用(是用起来很简单的意思)。

说起 Consul 的部署,用 docker-compose 最是方便。非常适合小项目使用:

version: '3'

services:
  consul:
    image: library/consul
    container_name: consul
    volumes:
      - "./data:/consul/data"
      - "./config:/consul/config"
    ports:
      - 8300:8300
      - 8301:8301
      - 8301:8301/udp
      - 8302:8302
      - 8302:8302/udp
      - 8400:8400
      - 8500:8500
      - 153:53/udp
    command: "agent -server -bind=0.0.0.0 -client=0.0.0.0 -node=consul_Server1 -bootstrap-expect=1 -ui"

启动后用 “http://localhost:8500” 打开(账号:admin;密码:public),就进入管理后台了。

1、认识 Solon

Solon 一个高效的应用开发框架:更快、更小、更简单,也是个新起的 Java 生态。
启动快 5 ~ 10 倍;qps 高 2~ 3 倍;运行时内存节省 1/3 ~ 1/2;打包可以缩到 1/2 ~ 1/10;同时支持 jdk8, jdk11, jdk17, jdk19。

Solon 项目官网:https://solon.noear.org

2、认识 Solon Cloud Config

Solon Cloud 是一套分布式(或微服务)开发的接口与配置规范。其中 Solon Cloud Config 为云端配置服务,主要提供分布式配置服务的接口并与相关的中间件客户端进行适配:

  • 通过 CloudConfigService 接口与中间件进行适配
  • 使用 CloudClient.config() 获取适配实例,可支持手动操作
  • 一般通过通过配置和 @CloudConfig 注解进行使用

其中 consul-solon-cloud-plugin,是 consul 关于 solon cloud config 的适配。也是本文的主角。

3、项目整合

3.1、在 Consul 管理后台准备两个配置

安装好 consul 后,需要准备下配置数据。consul 没有命名空间或组的概念,但 consul-solon-cloud-plugin 还是支持组的,用“/”隔开。新建个“demo/demoapp.yml” 配置(这个配置,用于导入到应用属性):

demo.user.name: "1"

再准备 “demo/demo-ds” 配置(这个配置,将直接使用):

demo.ds:
  url: ""
  username: ""
  password: ""

3.2、创建项目,完成配置

借助 Solon Initializr( https://solon.noear.org/start/ ) 生成一个 maven + java 的模板项目(这样方便些)。用开发工具打开项目(用 IDEA 不错,他们公司还为开源作者提供免费工具用。是好公司!)。在 pom.xml 里面添加依赖:

<dependencies>
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>consul-solon-cloud-plugin</artifactId>
    </dependency>
</dependencies>

然后,在应用属性配置文件“app.yml”,添加 consul 的连接信息:

solon.app:
  name: "demoapp"
  group: "demo"

solon.cloud.consul:
  server: "127.0.0.1"           #consul 服务地址
  config:
    load: "demoapp.yml"         #加载配置到应用属性(多个以","隔开)

“...config.load” 会导入配置到应用属性。之后可用“@Inject”注入,也可用“Solon.cfg().get(...)”获取。

3.3、代码应用

模板项目里,在 “App.java” 边上,添加 "Config.java" 类:

@Configuration
public class Config {
    //注入用户名 //来自 config.load 导入到应用属性的
    @Inject("${demo.user.name}") 
    String userName;
    
    //注入并转为数据源 //直接来自 "demo/demo-ds"
    @Bean
    public DataSource ds(@CloudConfig("demo-ds") HikariDataSource ds){
        return ds;
    }
}

直接获取 consul 配置,可以通过"@CloudConfig"注解,或者 "CloudClient.config().pull(group, name)" 手动获取。

4、多马甲项目的应用

很多情况下,公司会有相同的代码,但是不同的运营项目。这个场景下,自然是希望代码都不用改。可以通过 "solon.app.group" 配置进行切换,不支持命名空间,只能借用虚拟的组了。

4.1、添加新的配置

在 consul 里,添加 “demo2/demoapp.yml” 和 "demo2/demo-ds"。然后把刚才的配置复制一份。

4.2、修改项目应用配置

  • 通过 app.yml 修改配置
solon.app:
  name: "demoapp"
  group: "demo2"

solon.cloud.consul:
  server: "127.0.0.1"           #consul 服务地址
  config:
    load: "demoapp.yml"         #加载配置到应用属性(多个以","隔开)
  • 通过启动时指定(方式二)
java -Dsolon.app.group=demo2 -jar demoapp.jar 
  • 通过容器镜像的环境变量指定 (方式三)
services:
  demoapp:
    image: demo/demoapp:1.0.0
    container_name: demoapp
    environment:
      - solon.app.group=demo2
      - TZ=Asia/Shanghai
    ports:
      - 8080:8080

方式二、方式三。什么都不用改,只需要在部署运行时指定一下,推荐!