Skip to content

二、服务注册与发现-Discovery ​

1、模块简介 ​

服务注册发现模块是 Spring Cloud Tencent 最核心的模块之一,实现了标准的 Spring Cloud Discovery SPI 接口 (PolarisDiscoveryClient.java)。任何一个 Spring Cloud 标准应用都能快速平滑的使用 Spring Cloud Tencent Discovery。

Spring Cloud Tencent Discovery 背后对接的是社区流行的统一服务发现和治理平台 Polaris

2、快速入门 ​

本章节将介绍如何在 Spring Cloud 项目中使用 Spring Cloud Tencent Discovery 的功能。

完整 Example 代码请参考:polaris-discovery-example

3、引入 Polaris 服务端 ​

1、搭建本地北极星服务 ​

搭建北极星服务请参考 Polaris Getting Started

2、使用北极星开源提供的体验环境 ​

4、北极星Polaris单机版安装 ​

单机版安装地址

安装说明

北极星单机版包含以下4个组件:

  • polaris-console:可视化控制台,提供服务治理管控页面
  • polaris-server:控制面,提供数据面组件及控制台所需的后台接口
  • prometheus:服务治理监控所需的指标汇聚统计组件
  • pushgateway:prometheus推送网关,支持数据面通过推送方式上报监控数据到prometheus

北极星单机版默认占用以下端口:

  • polaris-console:8080(http/tcp)
  • polaris-server:8090(http/tcp,注册中心端口)、8091(grpc/tcp,注册中心端口)、8093(grpc/tcp,配置中心端口)
  • prometheus:9090(tcp)
  • pushgateway:9091(tcp)

1、单机版组网 ​

单机版北极星,所有的组件都安装在用户机器上,作为多个独立进程提供服务。

控制台

2、安装服务端 ​

北极星单机版支持以下4种运行环境:

  • Linux(64位)
  • Windows(64位)
  • Mac(64位)
  • 容器化

单机版软件包

单机版的安装需要依赖单机版软件包,单机版软件包的命名格式为polaris-standalone-release_*.zip:

image-20220629162154585

3、Linux ​

下载Linux单机版软件包(polaris-standalone-release_$version.linux.$arch.zip),执行安装命令:

sh
unzip polaris-standalone-release_$version.linux.$arch.zip
cd polaris-standalone-release_$version.linux.$arch
bash install.sh

4、Windows ​

  • 依赖powershell 5.0及以上版本(Windows 10及以上版本默认安装)
  • 需要以管理员身份运行安装脚本,执行powershell需要进行授权操作
  • 安装脚本可能遭到系统安全软件的误杀,请在安全软件中执行信任操作

下载Windows单机版软件包(polaris-standalone-release_$version.windows.$arch.zip),执行安装命令:

sh
执行解压:polaris-standalone-release_$version.windows.$arch.zip

进入目录:polaris-standalone-release_$version.windows.$arch

执行脚本:install.bat

5、Mac ​

  • 请在【关于本机】设置中查看Mac机器的芯片类型(Intel/Apple)
  • Intel芯片请使用amd64的软件包,Apple芯片请使用arm64的软件包

下载Mac单机版软件包(polaris-standalone-release_$version.darwin.$arch.zip),执行安装命令:

sh
unzip polaris-standalone-release_$version.darwin.$arch.zip

cd polaris-standalone-release_$version.darwin.$arch

bash install.sh

6、容器化 ​

  • 部署配置使用的是LoadBalancer类型的Service。如果您需要从k8s集群外访问北极星,且您的k8s集群不支持LoadBalancer,可以修改installk8s/02-polaris-server.yaml、installk8s/polaris-prometheus.yaml中Service的类型,调整为NodePort。如果您的集群支持Ingress,也可以通过Ingress从集群外访问。

下载k8s部署文件(polaris-standalone-release_$version.kubernetes.zip),将文件拷贝到配置了kubectl的机器上,执行安装命令:

sh
unzip polaris-standalone-release_$version.kubernetes.zip

kubectl create -f polaris-standalone-release_$version.kubernetes/
  • 00-polaris-console-config.yaml:创建名为polaris-console-config的Configmap,polaris-console组件的配置文件。
  • 01-polaris-server-config.yaml:创建名为polaris-server-config的Configmap,polaris-server组件的配置文件。
  • 02-polaris-server.yaml:创建名为polaris的StatefulSet ,其中包含了两个容器,分别是polaris-server的容器和polaris-console的容器。也创建了名为polaris的Service,暴露了8080 、8090和8091端口,其中8080为控制台提供web服务,8090提供北极星控制面的http服务,8091提供北极星控制面的grpc服务。
  • 03-prometheus.yaml:创建名为polaris-prometheus的Deployment,其中包含了两个容器,分别是prometheus和pushgateway。也创建了名为polaris-prometheus的Service,暴露了9090和9091端口,其中9090为prometheus请求端口,9091为pushgateway的请求端口。

7、安装验证 ​

在浏览器里输入北极星控制台地址(127.0.0.1:8080),非容器化场景127.0.0.1可替换成安装北极星的机器host。

  • 登录控制台的默认登录账户信息
sh
用户:polaris
密码:polaris

容器化场景,您需要通过北极星创建的名为polaris的Service来访问控制台,根据您采用的网络方案,有以下几种情况:

  • 如果您的k8s集群支持LoadBalancer的Service,并且您直接使用北极星提供的yaml部署,您需要使用polaris Service的EXTERNAL-IP:8080来访问。
  • 如果您修改了北极星提供的yaml,使用的是NodePort的Service,您需要使用集群Node的host和polaris Service中8080对应的NodePort来访问。
  • 如果您的k8s集群支持Ingress,您需要配置Ingress的backend的serviceName为polaris,并选择servicePort为8080。配置正常后,您可以通过您设置的域名访问。

image-20220629164154739

新建服务

进入服务列表页面,点击【新建】按钮,确认是否可以新建服务。新建服务成功表示安装成功

image-20220629165142650

8、启动与停止 ​

image-20220629165026706

5、搭建SpringCloud Tencent服务 ​

1、新建父工程spring-cloud-tencent ​

参考 Spring Cloud Tencent 版本管理 文档获取最新的版本号

pom.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xue</groupId>
    <artifactId>springcloud-tencent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <!-- 子模块 新建子模块之后会自动添加 -->
    <modules>
    	<module>springcloud-tencent-provider-demo</module>
    	<module>cloud-commons</module>
	</modules>
    
    <properties>
        <lombok.version>1.18.24</lombok.version>
        <sprint-boot-version>2.6.7</sprint-boot-version>
        <spring-cloud-tencent-version>1.5.3-2021.0.2</spring-cloud-tencent-version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.4.13 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${sprint-boot-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.tencent.cloud</groupId>
                <artifactId>spring-cloud-tencent-dependencies</artifactId>
                <version>${spring-cloud-tencent-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <repositories>
        <repository>
            <id>nexus-snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

2、新建common通用工程 ​

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud-tencent</artifactId>
        <groupId>com.xue</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-commons</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.11</version>
        </dependency>
    </dependencies>
</project>

3、新建提供者springcloud-tencent-provider-demo ​

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xue</groupId>
    <artifactId>springcloud-tencent-provider-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>com.xue</groupId>
        <artifactId>springcloud-tencent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>com.xue</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Cloud Tencent Discovery Starter -->
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
        </dependency>

    </dependencies>

</project>

4、启动类 ​

java
package com.xue;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author: xueqimiao
 * @Date: 2022/6/29 17:06
 */
@SpringBootApplication
public class ProviderDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderDemoApplication.class);
    }
}

5、配置文件 ​

在 bootstrap.yml 配置文件中加入以下配置内容

yaml
spring:
  application:
    name: ${application.name}
  cloud:
    polaris:
      address: grpc://${修改为第一步部署的 Polaris 服务地址}:8091
      namespace: default

示例

yaml
server:
  port: 8001

spring:
  application:
    name: springcloud-tencent-provider-demo
  cloud:
    polaris:
      address: grpc://127.0.0.1:8091
      namespace: default

6、启动应用 ​

应用成功启动后,到 Polaris 控制台查看服务注册信息。如下图所示:

image-20220629182852329

到此接入 Spring Cloud Tencent Discovery 即已完成。

7、拓展使用 ​

1、元数据 ​

1、元数据定义 ​

服务实例通常带有一系列的标签信息,例如实例所属的机房信息、地域信息、环境信息等,这些信息统称为服务实例的元信息。实例注册到注册中心时,会带上自身的元数据信息。当消费方从注册中心获取到实例时,既可以同时获取到每个实例的元信息。

image

2、元数据来源 ​

来源一:项目里的配置文件 ​

在 Spring Cloud 项目里的 application.yml 中配置以下内容:

yaml
spring:
  cloud:
    tencent:
      metadata:
        content:
          idc: shanghai
          env: dev1

应用在启动注册时,会自动读取配置文件并带上 idc=shanghai 和 env=dev1 两个元数据信息。

通过配置文件的方式为最直接的方式,但是这种方式有一个最大的弊端,就是设置不同元数据值时需要重新编译打包。本质上的原因就是:大部分的元数据信息属于部署环境的信息或者叫机器的信息,而不是应用静态代码的信息。

来源二:应用启动参数 ​

众所周知,Spring Boot 应用配置文件定义的配置项都可以通过 -D 启动参数覆盖,例如通过以下方式覆盖 env 值为 dev2 :

Java -jar -Dspring.cloud.tencent.metadata.content.env=dev2  demo.jar

通过启动参数的方式,可以在启动时动态修改元数据信息,而不用重新打包,从而解决了方式一的弊端。

但是这种方式也有弊端,就是谁负责修改启动脚本,加上 -D 参数呢?

大部分情况下,Java -jar 启动命令都放在项目里的 start.sh 脚本里,那也就是说,每次需要增加 -D 参数都要修改 start.sh,这本身也会增加维护成本。

来源三:环境变量 ​

环境变量的方式则完全跟运行的应用解耦,是完完全全的机器信息。Spring Cloud Tencent 约定了前缀 SCT_METADATA_CONTENT_ 的环境变量为应用的元数据信息。例如:

SCT_METADATA_CONTENT_IDC=shanghai
SCT_METADATA_CONTENT_ENV=dev1

应用在启动时,则会自动携带 IDC=shanghai 和 ENV=dev 的元数据。

通过环境变量的方式,paas 平台在拉起一台虚拟机或者一个容器 Pod 时,只需要设置相应的环境变量即可。而应用自身无需做任何其它事情。

以上几种方式,可以通过查看启动日志确认是否正确打标:

grep "Loaded static metadata info" xx.log
来源四:自定义实现 SPI (待实现) ​

前面三种方式为 SCT(Spring Cloud Tencent 的缩写) 内置的方式,但是并不一定符合每个公司自己的规范或者实现。例如:

  • 把元数据放到机器上的某一个配置文件里,例如 /etc/metadata
  • 启动时,调用 CMDB 的接口获取元信息

所以 SCT 定义了一个 SPI,方便用户自己实现元数据来源。SCT 在注册前,回调 SPI 获取元数据信息,并注册到注册中心。

2、控制台调整实例的权重、下线实现等操作 ​

如下图所示,可以在控制台上对实例进行一系列管控操作,例如隔离实例,调整实例权重等。

image

3、自定义参数 ​

除了控制台页面可以调整参数以外,Spring Cloud Tencent Discovery 提供了很多自定义参数满足各类场景。以权重随机策略为例,您可以在项目里的 bootstrap.yml 配置文件里配置 spring.cloud.polaris.weight 既可以调整权重值(默认为 100)。

完整的的配置列表如下

配置项Key默认值是否必填配置项说明
spring.cloud.polaris.address无是Polaris 后端地址
spring.cloud.polaris.namespacedefault否服务所在的命名空间名称
spring.cloud.polaris.service$否服务名称
spring.cloud.polaris.local-ip-address无否注册的 IP 地址,默认情况下 Spring Boot 会自动获取 IP 地址无需指定 IP 地址,当需要自定义 IP 地址时才需要设置
spring.cloud.polaris.discovery.enabledtrue否是否开启服务发现
spring.cloud.polaris.discovery.registertrue否是否开启服务注册
spring.cloud.polaris.discovery.instance-enabledtrue否当前微服务实例是否可以被访问
spring.cloud.polaris.discovery.token无否鉴权 Token
spring.cloud.polaris.discovery.versionnull否微服务版本
spring.cloud.polaris.discovery.protocolnull否微服务协议类型
spring.cloud.polaris.discovery.weight100否微服务权重
spring.cloud.polaris.discovery.service-list-refresh-interval60000否服务列表刷新间隔(毫秒)