Govern Service 基於 Redis 的服務治理平台(服務注冊/發現 & 配置中心)
Govern Service 是一個輕量級、低成本的服務注冊、服務發現、 配置服務 SDK,通過使用現有基礎設施中的 Redis (相信你已經部署了Redis),不用給運維部署帶來額外的成本與負擔。
借助於 Redis 的高性能, Govern Service 提供了超高TPS&QPS (10W+/s JMH 基准測試)。Govern Service 結合本地進程緩存策略 + Redis PubSub,實現實時進程緩存刷新,兼具無與倫比的QPS性能、進程緩存與 Redis 的實時一致性。
安裝
Gradle
Kotlin DSL
val governVersion = "0.9.19";
implementation("me.ahoo.govern:spring-cloud-starter-govern-config:${governVersion}")
implementation("me.ahoo.govern:spring-cloud-starter-govern-discovery:${governVersion}")
Maven
<?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>
<artifactId>demo</artifactId>
<properties>
<govern.version>0.9.19</govern.version>
</properties>
<dependencies>
<dependency>
<groupId>me.ahoo.govern</groupId>
<artifactId>spring-cloud-starter-govern-config</artifactId>
<version>${govern.version}</version>
</dependency>
<dependency>
<groupId>me.ahoo.govern</groupId>
<artifactId>spring-cloud-starter-govern-discovery</artifactId>
<version>${govern.version}</version>
</dependency>
</dependencies>
</project>
bootstrap.yaml (Spring-Cloud-Config)
spring:
application:
name: ${service.name:govern-rest-api}
cloud:
govern:
namespace: ${govern.namespace:govern-{system}}
config:
config-id: ${spring.application.name}.yaml
redis:
mode: ${govern.redis.mode:standalone}
url: ${govern.redis.uri:redis://localhost:6379}
logging:
file:
name: logs/${spring.application.name}.log
REST-API Server (Optional)
安裝 REST-API Server
方式一:下載可執行文件
解壓 govern-rest-api-0.9.19.tar
cd govern-rest-api-0.9.19
# 工作目錄: govern-rest-api-0.9.19
bin/govern-rest-api --server.port=8080 --govern.redis.uri=redis://localhost:6379
方式二:在 Docker 中運行
docker pull ahoowang/govern-service:0.9.19
docker run --name govern-service -d -p 8080:8080 --link redis -e GOVERN_REDIS_URI=redis://redis:6379 ahoowang/govern-service:0.9.19
MacBook Pro (M1)
請使用 ahoowang/govern-service:0.9.19-armv7
docker pull ahoowang/govern-service:0.9.19-armv7
docker run --name govern-service -d -p 8080:8080 --link redis -e GOVERN_REDIS_URI=redis://redis:6379 ahoowang/govern-service:0.9.19-armv7
方式三:在 Kubernetes 中運行
apiVersion: apps/v1
kind: Deployment
metadata:
name: govern-service-rest-api
spec:
replicas: 1
selector:
matchLabels:
app: govern-service-rest-api
template:
metadata:
labels:
app: govern-service-rest-api
spec:
containers:
- env:
- name: GOVERN_REDIS_MODE
value: standalone
- name: GOVERN_REDIS_URI
value: redis://redis-uri:6379
image: ahoowang/govern-service:0.9.19
name: govern-service
resources:
limits:
cpu: "1"
memory: 640Mi
requests:
cpu: 250m
memory: 512Mi
volumeMounts:
- mountPath: /etc/localtime
name: volume-localtime
volumes:
- hostPath:
path: /etc/localtime
type: ""
name: volume-localtime
---
apiVersion: v1
kind: Service
metadata:
name: govern-service-rest-api
labels:
app: govern-service-rest-api
spec:
selector:
app: govern-service-rest-api
ports:
- name: rest
port: 80
protocol: TCP
targetPort: 8080
Dashboard

命名空間管理

配置管理




服務管理


REST-API
Namespace

- /v1/namespaces
- GET
- /v1/namespaces/{namespace}
- PUT
- GET
- /v1/namespaces/current
- GET
- /v1/namespaces/current/{namespace}
- PUT
Config

- /v1/namespaces/{namespace}/configs
- GET
- /v1/namespaces/{namespace}/configs/{configId}
- GET
- PUT
- DELETE
- /v1/namespaces/{namespace}/configs/{configId}/versions
- GET
- /v1/namespaces/{namespace}/configs/{configId}/versions/{version}
- GET
- /v1/namespaces/{namespace}/configs/{configId}/to/{targetVersion}
- PUT
Service

- /v1/namespaces/{namespace}/services/
- GET
- /v1/namespaces/{namespace}/services/{serviceId}/instances
- GET
- PUT
- /v1/namespaces/{namespace}/services/{serviceId}/instances/{instanceId}
- DELETE
- /v1/namespaces/{namespace}/services/{serviceId}/instances/{instanceId}/metadata
- PUT
- /v1/namespaces/{namespace}/services/{serviceId}/lb
- GET
JMH-Benchmark
- 基准測試運行環境:筆記本開發機 ( MacBook Pro (M1) )
- 所有基准測試都在開發筆記本上執行。
- Redis 部署環境也在該筆記本開發機上。
ConfigService
gradle config:jmh
# JMH version: 1.29
# VM version: JDK 11.0.11, OpenJDK 64-Bit Server VM, 11.0.11+9-LTS
# VM invoker: /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/bin/java
# VM options: -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/Users/ahoo/govern-service/config/build/tmp/jmh -Duser.country=CN -Duser.language=zh -Duser.variant
# Blackhole mode: full + dont-inline hint
# Warmup: 1 iterations, 10 s each
# Measurement: 1 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 50 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
Benchmark Mode Cnt Score Error Units
ConsistencyRedisConfigServiceBenchmark.getConfig thrpt 265321650.148 ops/s
RedisConfigServiceBenchmark.getConfig thrpt 106991.476 ops/s
RedisConfigServiceBenchmark.setConfig thrpt 103659.132 ops/s
ServiceDiscovery
gradle discovery:jmh
# JMH version: 1.29
# VM version: JDK 11.0.11, OpenJDK 64-Bit Server VM, 11.0.11+9-LTS
# VM invoker: /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/bin/java
# VM options: -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/Users/ahoo/govern-service/discovery/build/tmp/jmh -Duser.country=CN -Duser.language=zh -Duser.variant
# Blackhole mode: full + dont-inline hint
# Warmup: 1 iterations, 10 s each
# Measurement: 1 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 50 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
Benchmark Mode Cnt Score Error Units
ConsistencyRedisServiceDiscoveryBenchmark.getInstances thrpt 76894658.867 ops/s
ConsistencyRedisServiceDiscoveryBenchmark.getServices thrpt 466036317.472 ops/s
RedisServiceDiscoveryBenchmark.getInstances thrpt 107778.244 ops/s
RedisServiceDiscoveryBenchmark.getServices thrpt 106920.412 ops/s
RedisServiceRegistryBenchmark.deregister thrpt 114094.513 ops/s
RedisServiceRegistryBenchmark.register thrpt 109085.694 ops/s
RedisServiceRegistryBenchmark.renew thrpt 127003.104 ops/s
