PolarisMesh 官网地址 https://polarismesh.cn/
PolarisMesh 官网中文文档 https://polarismesh.cn/zh/doc/%E5%8C%97%E6%9E%81%E6%98%9F%E6%98%AF%E4%BB%80%E4%B9%88/%E7%AE%80%E4%BB%8B.html
PolarisMesh GitHub源码地址 https://github.com/polarismesh
PolarisMesh(北极星)是腾讯开源的支持多语言、多框架的云原生服务发现和治理中心,提供高性能SDK和无侵入Sidecar两种接入方式。
前面多篇文章讲解Spring Cloud Alibaba微服务一站式解决全组件的原理和实践,Spring Cloud Alibaba主要服务于Java技术栈,而PolarisMesh提供多语言、框架无关、服务网格的实现,当之无愧的集大成者。北极星在腾讯内部的服务注册数量超过百万,日接口调用量超过十万亿,通用性和稳定性都得到了大规模的验证。
PolarisMesh不仅提供无侵入Sidecar,还提供高性能SDK,实现语义相同的服务发现和治理功能,用户可以根据业务场景自行选择。对于请求量大和资源消耗敏感用户,可以在业务应用或者开发框架中集成北极星SDK,快速补齐服务发现和治理功能。
PolarisMesh的功能都是基于插件化设计,可单独使用,采用计算存储分离,计算层节点可以随着客户端节点的增加平行扩展,轻松支持百万级节点接入。从功能大类来看,分为注册中心、配置中心以及服务网格三类功能
注册中心
配置中心
服务网格
PolarisMesh分为控制平面、数据平面以及生态组件3大类,通过这3大类组件,组成一套完整的微服务治理体系。
PolarisMesh兼容常用的开源框架、网关和 kubernetes。主要包含服务发现和治理中心、多语言应用开发、DNS 和 Proxy、网关。
服务发现和治理中心
多语言应用开发:支持Java、Go、C、C++、PHP、Lua,不劫持业务请求,几乎不增加请求延时,CPU 消耗低,不需要部署和运维 Sidecar。支持 grpc 等框架和北极星 SDK 的集成,框架用户不需要直接使用北极星 SDK。比如:
Sidecar:劫持业务请求,有一定的请求延时,CPU 消耗较高,适用于无侵入的开发场景。
JavaAgent:对于Java的应用,直接通过字节码的方式加载到进程中,通过拦截器实现无感的接入。
支持 nginx 等网关和北极星 SDK 的集成,支持网关将请求转发到北极星服务。
支持 k8s service 自动注册到北极星,实现 k8s service 和框架服务的统一管理。
在分布式架构及微服务架构实施过程中,业务可能面临以下四类问题。北极星以服务为中心,提供一站式解决方案。
在长时间的压力测试下,不同规格的北极星集群均维持正常运行状态,集群可承载的实例容量从1k实例到10w实例,相关依赖组件的系统资源消耗也均在预期内,并未出现相关依赖组件高负载不可用现象。通过压测,不同规格的北极星集群可以稳定支撑服务实例数量均满足预期。
PolarisMesh的资源模型与前面学习Nacos很相似,包括如下:
PolarisMesh是服务发现与治理中心,其主要应用在微服务之间的RPC调用过程中服务可见、流量控制、故障容错等场景,涉及服务注册、服务发现、动态路由、负载均衡、健康检查、访问限流、熔断降级。
整体流程如下:
服务注册
功能,向北极星注册自身服务数据,包括节点列表,治理规则等。服务发现
功能,拉取被调方的全量服务数据。路由和负载均衡
功能,筛选出一个合适的被调方实例,进行RPC调用。熔断降级
功能,剔除出现故障的被调方节点。健康检查
功能,主动剔除已经下线的被调方节点。访问限流
功能,保护自身不被主调方的异常流量给击溃。服务注册指的是被调方按照服务模型将自身的服务数据注册到PolarisMesh,以供主调方进行服务发现。服务数据主要包括以下部分:
支持以下4种服务注册方式:
服务发现指的主调方是根据服务名标识,拉取服务实例列表,以供后续进行服务调用的操作。
支持以下4种方式进行服务发现:
由于单机安装比较简单,我们这里就直接选择集群安装,准备好两台部署服务器,而MySQL、Redis、Promethes的安装可以参考前面对应的文章,这里就直接使用。
组件 | 类型 | 功能说明 | |
---|---|---|---|
polaris | 最新stable版本 | 系统组件 | 服务治理控制面 |
polaris-console | 最新stable版本 | 系统组件 | 服务治理控制台 |
MySQL | >= 5.7 | 第三方依赖 | 服务数据存储 |
Redis | >=4.0 | 第三方依赖 | 心跳状态数据缓存 |
Prometheus | >=2.28.0 | 第三方依赖 | 可观测性 |
# 下载polaris最新版本v1.12.1
wget https://github.com/polarismesh/polaris/releases/download/v1.12.1/polaris-server-release_v1.12.1.linux.amd64.zip
# 下载polaris-console最新版本v1.9.1
wget https://github.com/polarismesh/polaris-console/releases/download/v1.9.1/polaris-console-release_v1.9.1.linux.amd64.zip
# 解压polaris-server
unzip polaris-server-release_v1.12.1.linux.amd64.zip
# 解压polaris-console
unzip polaris-console-release_v1.9.1.linux.amd64.zip
# 进入polaris-server目录
cd polaris-server-release_v1.12.1.linux.amd64
# 执行mysql脚本导入到mysql数据库
mysql -u root -p 123456 -h 192.168.50.100 < store/sqldb/scripts/polaris_server.sql
将文件拷贝到两台服务器上,下面操作两台一样
# 存储配置
store:
# 数据库存储插件
name: defaultStore
option:
master:
dbType: mysql
dbName: polaris_server
dbAddr: 192.168.50.100:3306
dbUser: root
dbPwd: 123456
bootstrap:
polaris_service:
# 设置为true代表启用自动注册
enable_register: true
# 填入数据库地址,用于获取当前节点ip信息
probe_address:192.168.50.100:3306
healthcheck:
checkers:
- name: heartbeatRedis
option:
#填入redis的IP以及端口
kvAddr: 192.168.50.100:6379
#填入redis的密码
kvPasswd: 123456
maxIdle: 200
idleTimeout: 120s
connectTimeout: 200ms
msgTimeout: 200ms
concurrency: 200
bash ./tool/start.sh
bash ./tool/p.sh
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
http_sd_configs:
- url: http://192.169.5.52:9000/prometheus/v1/clients
honor_labels: true
nohup ./prometheus --web.enable-lifecycle --web.enable-admin-api >> prometheus.out 2>&1 &
monitorServer:
address: "192.168.5.52:9090"
bash ./tool/start.sh
bash ./tool/p.sh
http://192.168.5.52:8080
,可以看到登录页面,输入登录控制台的默认登录账户信息polaris/polaris,登录后可以成功看到北极星服务治理控制台内容Spring Cloud 是 Java 语言生态下的分布式微服务架构的一站式解决方案,为了方便 Spring Cloud 用户快速接入北极星,我们通过以下几个示例帮助用户如何在 Spring Cloud 中体验北极星的相关功能。 Spring Cloud 版本相对应的 Spring Cloud Tencent 版本如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nw4H2svH-1666971286536)(image-20221028134706394.png)]
选择Spring Cloud 版本为 2021.0.3、Spring Cloud Tencent 版本为 1.7.0-2021.0.3
在Idea中新建一个空的maven项目,Pom文件增加与Spring Cloud Tencent 的父依赖spring-cloud-tencent-dependencies和SpringBoot的父依赖spring-boot-starter-parent。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.9</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>com.tencent.cloud</groupId> <artifactId>spring-cloud-tencent-dependencies</artifactId> <version>1.7.0-2021.0.3</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 简单的 Spring Cloud Web 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 --> <dependency> <groupId>com.tencent.cloud</groupId> <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId> </dependency> </dependencies></project>
在项目中添加一个provider-service模块,在提供者微服务的pom依赖中添加父Maven项目的依赖、 Web 服务依赖、polaris服务注册依赖
<parent> <groupId>cn.itxs</groupId> <artifactId>spring-cloud-tencent-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <!-- 简单的 Spring Cloud Web 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 --> <dependency> <groupId>com.tencent.cloud</groupId> <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency>
在provider-service的 resources 目录下创建 application.yml 文件,并按照如下进行配置
server: port: 28888spring: application: name: provider-service cloud: polaris: # 配置polaris servre地址 address: grpc://192.168.5.52:8091 discovery: enabled: true stat: enabled: true port: 28082
创建提供者微服务演示控制器ProviderHelloController.java
package cn.itxs.controller;import com.tencent.cloud.polaris.PolarisDiscoveryProperties;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ProviderHelloController { private final PolarisDiscoveryProperties properties; ProviderHelloController(PolarisDiscoveryProperties properties) { this.properties = properties; } @RequestMapping("/hello/{val}") public String echo(@PathVariable String val) { return "Hello PolarisMesh,this is it xiao shen," + val + ", I'm " + properties.getService(); }}
启动类ProviderApplication.java
package cn.itxs;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ProviderApplication{ public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); }}
启动提供者微服务ProviderApplication
查看控制台页面服务列表可以看到提供者微服务已经注册到北极星中default命名空间
与上面服务提供类似,在项目中添加一个consumer-service模块,在消费者微服务的pom依赖中添加父Maven项目的依赖、 Web 服务依赖、polaris服务注册依赖
<parent>
<groupId>cn.itxs</groupId>
<artifactId>spring-cloud-tencent-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<!-- 简单的 Spring Cloud Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 Spring Cloud Tencent 的服务注册发现依赖 -->
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
</dependency>
<!-- 引入 Feign 依赖实现 Feign 调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
在consumer-service的 resources 目录下创建 application.yml 文件,并按照如下进行配置
server:
port: 38888
spring:
application:
name: consumer-service
cloud:
polaris:
address: grpc://192.168.5.52:8091
discovery:
enabled: true
stat:
enabled: true
port: 38082
创建Feign接口HelloService.java,通过feign实现远程方法的调用
package cn.itxs.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Service
@FeignClient(name = "provider-service")
public interface HelloService {
@RequestMapping("/hello/{value}")
String hello(@PathVariable("value") String value);
}
创建提供者微服务演示控制器ProviderHelloController.java
package cn.itxs.controller;
import cn.itxs.service.HelloService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerHelloController {
private final HelloService helloService;
ConsumerHelloController(HelloService helloService) {
this.helloService = helloService;
}
@RequestMapping(value = "/hello/{val}")
public String echo(@PathVariable String val) {
return helloService.hello(val);
}
}
启动类ConsumerApplication.java
package cn.itxs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class ConsumerApplication
{
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
启动消费者微服务ProviderApplication
查看控制台页面服务列表可以看到提供者微服务已经注册到北极星中default命名空间
通过消费者提供控制器访问接口访问,http://192.168.44.161:38888/hello/1 ,返回服务提供者的结果,成功实现服务注册和发现。
引入spring-cloud-starter-tencent-polaris-config 实现 Spring Cloud 配置的动态管理,spring-cloud-starter-bootstrap 以便可以支持 bootstrap.yml 的识别与加载。添加依赖如下:
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-starter-tencent-polaris-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
在 resources 目录下创建 bootstrap.yml 文件,并按照如下进行配置
server:
port: 48084
spring:
application:
name: config-group
cloud:
polaris:
address: grpc://192.168.5.52:8091
namespace: default
config:
auto-refresh: true # auto refresh when config file changed
groups:
- name: ${spring.application.name} # group name
files: [ "config/user.yaml" ]
创建配置分组以及配置文件
config/user.yaml
,编辑和发布配置,编辑配置项内容为name: zhangsan创建提供者微服务演示控制器ConfigController.java
package cn.itxs.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class ConfigController {
@Value("${name}")
private String name;
@RequestMapping("/name")
public String name() {
return name;
}
}
启动后访问http://192.168.44.161:48084/name,成功读到北极星配置中心的配置
**本人博客网站 **IT小神 www.itxiaoshen.com