Java微服务:Consul篇

Consul与Kubernetes有许多集成,可以直接在Kubernetes上以服务器或客户端模式运行。本文介绍如何在Kubernetes集群(如果有K8s环境,可跳过先决条件的相关安装)上运行Consul Service Mesh,完成服务发现,并利用Consul分布式键值存储,完成Quarkus Java应用在运行时从Consul读取配置。

先决条件

  • 安装Virturlbox
  • 安装Minikube:
# 安装
brew install minikube
# 或
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.30.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

# 启动
minikube start
  • 安装Kubectl:brew install kubernetes-cli
  • 安装Helm:brew install kubernetes-helm

在Kubernetes上部署Consul

在Kubernetes上运行Consul的推荐方法是通过 Helm chart。
这里是一个详细的安装和配置步骤,几分钟内就可以部署并运行一个完整的Consul。
使用官方Helm chart安装Consul

helm repo add hashicorp https://helm.releases.hashicorp.com
helm install consul hashicorp/consul --set global.name=consul
kubectl port-forward service/consul-server 8500:8500

在Kubernetes上部署Consul Service Mesh

运行Envoy的Connect sidecar可以自动注入到集群的pod中,从而自动配置Kubernetes。这里是一个安装和配置Consul Service Mesh的详细步骤。

  1. 配置Helm chart

    cat > consul-values.yaml <

    说明:

    • connectInject键设置为true来启用Consul Connect Service Mesh。
    • syncCatalog设置为true来启用同步Kubernetes和Consul Services功能,Consul可以自动同步Kubernetes和Consul中的服务。
  2. 部署Consul Service Mesh
    helm install -f consul-values.yaml hashicorp hashicorp/consul
    安装Connect injector后,便会自动将Envoy作为Sidecar代理添加到Kubernetes集群,所以使用Consul Service Mesh的所有服务都将自动注册到Consul目录中。启用syncCatalogconnectInject的情况下,将不再需要手动注册托管在Kubernetes集群上的服务。

  3. 访问Consul UI
    minikube service hashicorp-consul-ui
    在浏览器中打开Consul UI服务(http://localhost:18500),其中包含Consul服务,节点和其他资源的列表。

    Consul UI-Services

  4. 滚动更新
    运行Consul时,可以通过helm upgrade命令更新配置和部署。
    helm upgrade hashicorp -f consul-values.yaml hashicorp/consul

Quarkus-从Consul读取配置属性

Consul提供了一个分布式的KV存储,我们将其作为Quarkus服务的配置源。

  1. 在Quarkus项目中添加consul-config扩展
    ./mvnw quarkus:add-extension -Dextensions="consul-config"

  2. 在程序中使用@ConfigProperty 读取配置

    
    import org.eclipse.microprofile.config.inject.ConfigProperty;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    @Path("/gateway")
    public class Gateway {
        @ConfigProperty(name = "client.host")
        String host;
        @ConfigProperty(name = "client.port")
        int port;
    
        String path = "/v1/batch";
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return host + ":" + port + path;
        }
    }
    
  3. 配置应用
    src/main/resources/application.properties中添加应用配置:

    # Consul服务器名称
    quarkus.application.name=consul-test
    # 启用从Consul读取配置文件
    quarkus.consul-config.enabled=true
    # 此Quarkus应用程序要从Consul配置服务器读取的KV存储的键
    quarkus.consul-config.properties-value-keys=config/${quarkus.application.name}
    
  4. 将配置添加到Consul
    通过Consul UI(或调用API)添加属性:


    Consul UI-K/V

config/consul-test:

client.host=127.0.0.1
client.port=8000
  1. 打包并运行:./mvnw compile quarkus:dev

Quarkus允许Java程序在运行时读取Consul配置,将Quarkus应用项目打包并部署到Kubernetes中,Consul Service Mesh就自动进行服务同步和发现,任何Consul或Quarkus问题,欢迎评论区积极讨论,互相学习,永远进步。

你可能感兴趣的:(Java微服务:Consul篇)