Skip to content

SunMaybo/zero

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

90 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

zero

本项目是一个微服务开发脚手架,旨在快速构建一个跨平台的微服务架构,帮助开发人员提高开发效率。

设计原则

  1. 兼容各种语言平台,目前支持 GOLANGJAVA
  2. 不重复造轮子,选择社区里比较优秀和成熟的开源框架。
  3. 频繁和繁重的工作用代码自动生成提高开发效率。
  4. 开源框架的集成做到可扩展性。
  5. 统一的约定和规范保障项目的风格规范一致。

跨平台兼容

  1. 选择 Grpc+Protobuf 实现RPC服务调用并做到垮语言兼容。
  2. 采用OpenTracing+Sleuth标准实现链路追踪,你可以选择OpenTracing标准下的优秀的链路追踪项目集成。
  3. 自研zctl帮助工具方便开发者在WindowsLinuxMacos进行代码生成。

功能清单

  • 快速安装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

img_1.png

安装Protobuff编译环境

安装工具

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

img.png

温馨提示

  1. 你可以通过--proxy 指定http_proxy解决下载问题。
  2. GOLANG方式安装会帮助安装好JAVA环境所需要的编译插件。

快速开始

开启一个nacos-server

docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2

greeter.proto

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;

}

JAVA项目

演示DEMO

asset_platform

生成project 项目

zctl java_project --g com.jewel.meta --a asset_platform

img.png

生成 Grpc+Protobuf Maven依赖包

zctl java_grpc_package --p ./proto/greeter_service

img.png

注意: 通过指定Maven 的私服的地址依赖包会上传到私服中,其中:

  1. 你可以通过 --m 指定Maven的执行路径。
  2. 你可以通过--r 指定Maven 私服的地址的执行路径。
  3. 你可以通过--v 指定当前包的版本。
  4. 你也可以在$Home/.zctl/config.yaml 下指定这些配置。

创建一个GRPC服务greeter-service

引入依赖

    <dependencies>
        <dependency>
            <groupId>com.jewel.meta.asset_platform</groupId>
            <artifactId>greeter-service-proto</artifactId>
            <version>0.0.2-SNAPSHOT</version>
        </dependency>
    </dependencies>

img.png img_1.png img_2.png img_3.png

创建一个调用服务greeter-api

引入依赖

    <dependencies>
        <dependency>
            <groupId>com.jewel.meta.asset_platform</groupId>
            <artifactId>greeter-service-proto</artifactId>
            <version>0.0.2-SNAPSHOT</version>
        </dependency>
    </dependencies>

img.png

GOLANG项目

演示Demo

metdata

创建一个项目

创建一个目录并创建go.mod文件

module github.com/SunMaybo/metadata

img_2.png

proto文件管理

img.png

生成greeter-service服务

/zctl golang_module --m asset_platform --t services

img_1.png img_3.png img_4.png client img_5.png server img_6.png

项目结构

JAVA项目结构

建议一个仓库管理同一个领域的微服务,开发规范按照JAVA开发规范。

proto------> 用于存放proto文件
    asset_platform------> 对应模块或者说项目
        - greeter.proto
        - common.proto
greeter_service------> SpringBoot 服务
greeter_api ------> SpringBoot 服务

GOLANG项目结构

建议一个仓库管理多个领域服务。

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----->通用工具代码
  ......

数据校验

JAVA数据校验

采用envovyproxy-validate 进行数据校验,工具自动生成校验代码,你只需要通过配置相应的校验拦截器。

@Configuration
@RefreshScope
public class GrpcServerAutoConfig {

    @Bean
    public GlobalServerInterceptorConfigurer globalInterceptorConfigurerAdapter() {
        return registry -> {
            registry.add(new ValidatingServerInterceptor(new ReflectiveValidatorIndex()));
        };
    }

}

GOLANG数据校验

采用protoc-go-inject-tag 通过在pb.go中注入标签进行校验,另外框架封装了go-playground进行校验。

文档生成

通过工具快速生成接口文档

 zctl doc --s ./proto/services/asset_platform

GRPC接口测试

你可以下载bloomrpc 工具进行接口测试。

熔断降级

GOLANG

目前框架支持go-hystrix进行服务熔断

JAVA

在SpringBoot体系下你可以灵活选择任何你想使用的工具。

链路追踪

采用 OpenTracing+Sleuth进行链路追踪,目前框架已经支持日志中存放追踪ID信息方便进行问题定位,你也可以通过配置将日志投放到类似zipkin链路追踪服务。

授权机制

GOLANG

通过添加拦截器方式做JWT鉴权,并可以过滤掉不需要做鉴权的RPC方法

jwtInterceptor := grpc.ChainUnaryInterceptor(
	interceptor.UnaryJWTServerInterceptor("secret", nil),
))

GrpcClient调用

client,_:=zrpc.NewClient(cfg.Zero).GetGrpcClient("greeter-service", grpc.WithPerRPCCredentials(interceptor.NewTokenAuth("token", false)))

JAVA

可以再调用方和服务实现方通过配置拦截器再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() {

            }
        });

超时时间

GOLANG

服务端配置整体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)))

JAVA

不支持

其它

GOLANG HTTP服务

通过工具快速创建一个GOLANG的HTTP接口服务

 zctl golang_http_service --m security --s sso_api

目录结构

    config              ------> 存放配置文件对应的结构体
    controller          ------> 存放gin controller接口handler
    etc                 ------> 存放配置文件config.yaml
    repo                ------> 数据库访问层
    server              ------> 存放router信息
    svc                 ------> 存放上下文资源配置
    main.go             ------> 启动入口

支持功能

  1. 通过Gin提供接口
  2. 日志追踪 Opening Tracing 通过Gorm访问MYSQL并日志中添加TraceID信息
  3. 服务端设置timeout
  4. prometheus metrics
  5. 通过Nacos做服务发现并调用GRPC接口服务

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages