二、服务注册与发现-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、使用北极星开源提供的体验环境
Console Address :
- Username: polaris
- Password: polaris
Server Address:
grpc://183.47.111.80:8091
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
:
- Github下载:polaris standalone releases(opens new window)
- Gitee下载:polaris standalone releases(opens new window)
3、Linux
下载Linux单机版软件包(polaris-standalone-release_$version.linux.$arch.zip),执行安装命令:
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),执行安装命令:
执行解压: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),执行安装命令:
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的机器上,执行安装命令:
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。
- 登录控制台的默认登录账户信息
用户: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。配置正常后,您可以通过您设置的域名访问。
新建服务
进入服务列表页面,点击【新建】按钮,确认是否可以新建服务。新建服务成功表示安装成功
8、启动与停止
5、搭建SpringCloud Tencent服务
1、新建父工程spring-cloud-tencent
参考 Spring Cloud Tencent 版本管理 文档获取最新的版本号
pom.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 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 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、启动类
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
配置文件中加入以下配置内容
spring:
application:
name: ${application.name}
cloud:
polaris:
address: grpc://${修改为第一步部署的 Polaris 服务地址}:8091
namespace: default
示例
server:
port: 8001
spring:
application:
name: springcloud-tencent-provider-demo
cloud:
polaris:
address: grpc://127.0.0.1:8091
namespace: default
6、启动应用
应用成功启动后,到 Polaris 控制台查看服务注册信息。如下图所示:
到此接入 Spring Cloud Tencent Discovery 即已完成。
7、拓展使用
1、元数据
1、元数据定义
服务实例通常带有一系列的标签信息,例如实例所属的机房信息、地域信息、环境信息等,这些信息统称为服务实例的元信息。实例注册到注册中心时,会带上自身的元数据信息。当消费方从注册中心获取到实例时,既可以同时获取到每个实例的元信息。
2、元数据来源
来源一:项目里的配置文件
在 Spring Cloud 项目里的 application.yml 中配置以下内容:
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、控制台调整实例的权重、下线实现等操作
如下图所示,可以在控制台上对实例进行一系列管控操作,例如隔离实例,调整实例权重等。
3、自定义参数
除了控制台页面可以调整参数以外,Spring Cloud Tencent Discovery 提供了很多自定义参数满足各类场景。以权重随机策略为例,您可以在项目里的 bootstrap.yml 配置文件里配置 spring.cloud.polaris.weight
既可以调整权重值(默认为 100)。
完整的的配置列表如下
配置项Key | 默认值 | 是否必填 | 配置项说明 |
---|---|---|---|
spring.cloud.polaris.address | 无 | 是 | Polaris 后端地址 |
spring.cloud.polaris.namespace | default | 否 | 服务所在的命名空间名称 |
spring.cloud.polaris.service | $ | 否 | 服务名称 |
spring.cloud.polaris.local-ip-address | 无 | 否 | 注册的 IP 地址,默认情况下 Spring Boot 会自动获取 IP 地址无需指定 IP 地址,当需要自定义 IP 地址时才需要设置 |
spring.cloud.polaris.discovery.enabled | true | 否 | 是否开启服务发现 |
spring.cloud.polaris.discovery.register | true | 否 | 是否开启服务注册 |
spring.cloud.polaris.discovery.instance-enabled | true | 否 | 当前微服务实例是否可以被访问 |
spring.cloud.polaris.discovery.token | 无 | 否 | 鉴权 Token |
spring.cloud.polaris.discovery.version | null | 否 | 微服务版本 |
spring.cloud.polaris.discovery.protocol | null | 否 | 微服务协议类型 |
spring.cloud.polaris.discovery.weight | 100 | 否 | 微服务权重 |
spring.cloud.polaris.discovery.service-list-refresh-interval | 60000 | 否 | 服务列表刷新间隔(毫秒) |