[!tip] 在阅读详细技术文档之前,有必要对我们当前使用的技术做一份详细的介绍。
技术选型
- graphql(我们使用了 graphql 替代了原本的 json), 关于graphql的语法,可通过此链接查看。
- grpc(同时我们选用了grpc作为后端的传输协议) ,关于 grpc 的详细语法,可通过此链接查看
框架选型
- 整体微服务我们采用了consul作为配置中心和注册中心,同时数据库全部采用了postgres的方案。
- graphql 的相关框架使用了 netflix-dgs-framework,详情见https://github.com/Netflix/dgs-framework
- grpc 使用了如下gRPC-Spring-Boot-Starter,详情见https://yidongnan.github.io/grpc-spring-boot-starter/zh-CN/
对于以上提到过的相关技术,如果你已经做了相关的了解,您可以根据此demo进行练习 。
- 主目录
- grpc-api 定义 protobuf 文件的工程
- grpc-order 订单的grpc服务
- grpc-customer 客户的grpc服务
- grpc-supplier 供应商的服务
此版本为了方便demo的上手,只需要java环境即可
相比于 restful 接口, grpc 采用的是预先定义协议的模式。
syntax = "proto3"; // 指定 proto 的版本,我们这边使用的是 proto3
package fc.basic; // 定义 proto 的 package,此部分和下面的 java_package 相关。如果我们在下面不指定 java_package 的名称,编译器会将此名称当作包名
option java_multiple_files = true;
option java_package = "fc.proto.basic";
option java_outer_classname = "CustomerProto"; // 输出的 class 名称
// 在 protobuf 中,可以通过 import 去引用其他地方声明的实体
import "google/protobuf/wrappers.proto";
// 我们先定义一个实体
// 在 proto 中, 使用 message 开头定义实体
message Customer{
// 对于 protobuf 的基本类型,我们这边不再进行赘述
int64 id=1;
string customer_name=2;
string customer_address=3;
// 在 protobuf 中,接口直接的调用不会根据名称去匹配值,而是根据名称对应的数字去匹配
}
// 接着,我们定义一个服务
service CustomerService{
// 根据 id 查询客户
rpc customer(google.protobuf.Int64Value) returns (Customer);
}
在定义好 protobuf 之后,我们需要将他编译为 java 文件。我们采用 protobuf-maven-plugin 这个插件进行编译
# Query 是整个 graphql 的跟查询节点.所有的查询都要从这里暴露出去
type Query {
customer(id:ID):Customer
}
# 我们在这里声明一个 Customer 的 graphql 类型
type Customer{
id:ID # graphql 特有的id类型,对应java里的String或者Long
customerName:String
customerAddress:String
}
在使用 Graphql 之后,我们应该如何测试我们的接口呢。最简单的方式就是使用PLayGround了,详情见 playground.md
有任何问题的,欢迎在issues里面提问