- zero
本项目是一个微服务开发脚手架,旨在快速构建一个跨平台的微服务架构,帮助开发人员提高开发效率。
- 兼容各种语言平台,目前支持
GOLANG
、JAVA
。 - 不重复造轮子,选择社区里比较优秀和成熟的开源框架。
- 频繁和繁重的工作用代码自动生成提高开发效率。
- 开源框架的集成做到可扩展性。
- 统一的约定和规范保障项目的风格规范一致。
- 选择
Grpc
+Protobuf
实现RPC服务调用并做到垮语言兼容。 - 采用
OpenTracing
+Sleuth
标准实现链路追踪,你可以选择OpenTracing标准下的优秀的链路追踪项目集成。 - 自研
zctl
帮助工具方便开发者在Windows
、Linux
、Macos
进行代码生成。
- 快速安装Protobuf+Grpc+Validate+Doc等工具
- GOLANG生成HTTP服务以及GRPC服务项目
- JAVA项目生成GRPC服务项目
- Proto+GRPC JAVA和GOLANG生成包括数据校验以及文档生成
- JAVA GRPC 工具包MAVEN管理
- OpeningTracing 链路追踪并格式化日志中添加追踪信息
- Nacos作为服务注册中心和配置中心
- prometheus metrics GRPC+HTTP接口监控
- GOLANG GRPC服务端熔断降级
- GRPC JWT鉴权
- GRPC+HTTP微服务项目服务端超时设置
选择Nacos
作为服务注册中心,框架实现GOLANG版的Nacos
服务注册和发现。
选择Nacos
作为服务配置中心,框架实现GOLANG版的Nacos
服务配置。
go install github.com/SunMaybo/zero/zctl@latest
protoc-3.20.0
protoc-gen-validate-0.6.7
protoc-gen-grpc-java-1.45.1
protoc-gen-doc_1.5.1
protoc-go-inject-tag
protoc-gen-go-grpc
zctl install --lang golang
温馨提示:
- 你可以通过
--proxy
指定http_proxy解决下载问题。 - GOLANG方式安装会帮助安装好JAVA环境所需要的编译插件。
docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2
syntax = "proto3";
package greeter;
option go_package = "/greeter";
import "google/protobuf/timestamp.proto";
option java_package = "com.jewel.meta.asset_platform.proto.greeter_service";
option java_outer_classname = "GreeterServiceProtocol";
import "validate/validate.proto";
service GreeterService {
rpc SayHelloWord(HelloRequest)returns (HelloReply) {}
rpc SayStream(stream HelloRequest)returns(stream HelloReply){}
rpc SayStream1(stream HelloRequest)returns(HelloReply){}
rpc SayStream2(HelloRequest)returns(stream HelloReply){}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
//用户编号
// @inject_tag: validate:"required,max=32"
string message = 1 [(validate.rules).string.len = 5];
google.protobuf.Timestamp time = 2;
}
zctl java_project --g com.jewel.meta --a asset_platform
zctl java_grpc_package --p ./proto/greeter_service
注意
: 通过指定Maven 的私服的地址依赖包会上传到私服中,其中:
- 你可以通过
--m
指定Maven的执行路径。 - 你可以通过
--r
指定Maven 私服的地址的执行路径。 - 你可以通过
--v
指定当前包的版本。 - 你也可以在
$Home/.zctl/config.yaml
下指定这些配置。
引入依赖
<dependencies>
<dependency>
<groupId>com.jewel.meta.asset_platform</groupId>
<artifactId>greeter-service-proto</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
</dependencies>
引入依赖
<dependencies>
<dependency>
<groupId>com.jewel.meta.asset_platform</groupId>
<artifactId>greeter-service-proto</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
</dependencies>
创建一个目录并创建go.mod文件
module github.com/SunMaybo/metadata
/zctl golang_module --m asset_platform --t services
建议一个仓库管理同一个领域的微服务,开发规范按照JAVA开发规范。
proto------> 用于存放proto文件
asset_platform------> 对应模块或者说项目
- greeter.proto
- common.proto
greeter_service------> SpringBoot 服务
greeter_api ------> SpringBoot 服务
建议一个仓库管理多个领域服务。
common------> 通用代码目录
proto------> 用于存放proto文件
services
asset_platform------> 对应模块或者说项目
- greeter.proto
- common.proto
apis------> 对外服务的proto文件
asset_api-----> 对应模块或者说项目
-greeter_api.proto
apis------> 对外服务可以是open_api,grpc_web,http,websocket等
asset_api-----> 对应模块或者说项目
- greeter_gateway------>对外服务
- greeter_api
services------>存放对应的微服务
asset_platform------> 对应模块或者说项目
- greeter------> 具体微服务
rpc
etc------>配置文件存放目录
config------> 配置文件mapping层
logic------> RPC服务实现层
svc------>serviceContext 上下文配置
server-----> GRPC 服务层自动生成
main.go-----> 启动入口
tasks----->可以放入一些非接口的任务执行服务
utils----->通用辅助代码目录
tools----->通用工具代码
......
采用envovyproxy-validate 进行数据校验,工具自动生成校验代码,你只需要通过配置相应的校验拦截器。
@Configuration
@RefreshScope
public class GrpcServerAutoConfig {
@Bean
public GlobalServerInterceptorConfigurer globalInterceptorConfigurerAdapter() {
return registry -> {
registry.add(new ValidatingServerInterceptor(new ReflectiveValidatorIndex()));
};
}
}
采用protoc-go-inject-tag 通过在pb.go中注入标签进行校验,另外框架封装了go-playground进行校验。
通过工具快速生成接口文档
zctl doc --s ./proto/services/asset_platform
你可以下载bloomrpc 工具进行接口测试。
目前框架支持go-hystrix进行服务熔断
在SpringBoot体系下你可以灵活选择任何你想使用的工具。
采用 OpenTracing
+Sleuth
进行链路追踪,目前框架已经支持日志中存放追踪ID信息方便进行问题定位,你也可以通过配置将日志投放到类似zipkin
链路追踪服务。
通过添加拦截器方式做JWT鉴权,并可以过滤掉不需要做鉴权的RPC方法
jwtInterceptor := grpc.ChainUnaryInterceptor(
interceptor.UnaryJWTServerInterceptor("secret", nil),
))
GrpcClient调用
client,_:=zrpc.NewClient(cfg.Zero).GetGrpcClient("greeter-service", grpc.WithPerRPCCredentials(interceptor.NewTokenAuth("token", false)))
可以再调用方和服务实现方通过配置拦截器再metadata中存放authorization:jwt-token,和鉴权Token。
@Configuration
@RefreshScope
public class GrpcServerAutoConfig {
@Bean
public GlobalServerInterceptorConfigurer globalInterceptorConfigurerAdapter() {
return registry -> {
registry.add(new ValidatingServerInterceptor(new ReflectiveValidatorIndex()));
registry.add(new GlobalGrpcExceptionHandler());
registry.add(new ServerInterceptor() {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> serverCallHandler) {
return null;
}
});
};
}
}
客户端配置授权可以在metadata中写入JWT
greeterServiceBlockingStub.withCallCredentials(new CallCredentials() {
@Override
public void applyRequestMetadata(RequestInfo requestInfo, Executor executor, MetadataApplier metadataApplier) {
}
@Override
public void thisUsesUnstableApi() {
}
});
服务端配置整体GRPC调用超时时间
zero:
rpc:
name: greeter-service
port: 8088
is_online: false
weight: 1
group_name: format
cluster_name: default_test
enable_metrics: true
timeout: 5000 //RPC服务超时时间配置
metrics_port: 8843
metrics_path: /metrics
metadata:
active: format
metrics: "/metrics"
metrics_port: "8843"
客户端指定访问超时时间
client,_:=zrpc.NewClient(cfg.Zero).GetGrpcClientWithTimeout(
"greeter-service",
5*time.Second,
grpc.WithPerRPCCredentials(interceptor.NewTokenAuth("token", false)))
不支持
zctl golang_http_service --m security --s sso_api
config ------> 存放配置文件对应的结构体
controller ------> 存放gin controller接口handler
etc ------> 存放配置文件config.yaml
repo ------> 数据库访问层
server ------> 存放router信息
svc ------> 存放上下文资源配置
main.go ------> 启动入口
通过Gin提供接口
日志追踪
Opening Tracing
通过Gorm访问MYSQL并日志中添加TraceID信息
服务端设置timeout
prometheus metrics
通过Nacos做服务发现并调用GRPC接口服务