Windows rpc + grpc安装


一、微服务简介

服务是一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。服务拆分原则:高内聚低耦合
微服务架构风格是将单个应用程序作为一组小型服务开发的方法,每个服务程序都在自己的进程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务是围绕业务功能构建的。可以通过全自动部署机器独立部署。这些服务器可以用不同的编程语言编写,使用不同的数据存储技术,并尽量不用集中式方式进行管理。微服务架构精髓:分而治之,合而用之

易混淆概念:
微服务架构:将复杂的系统使用组件化的方式进行拆分,并使用轻量级通讯方式进行整合的一种设计方法
微服务:通过这种架构设计方法拆分出来的一个独立的组件化的小应用

单体式服务架构和微服务架构

单体式服务架构
特性:

  • 复杂性随着开发越来越高, 遇到问题解决困难。
  • 技术债务逐渐上升。
  • 耦合度高,维护成本大!
    1. 出现bug, 不容易排查
    2. 解决旧bug, 会出新bug
  • 持续交付时间较长。
  • 技术选型成本高,风险大。
  • 扩展性较差
    1. 垂直扩展:通过增加单个系统程的负荷来实现扩展。
    2. 水平扩展:通过增加更多的系统成员来实现扩展。

微服务架构

  • 优点:
    1. 职责单一
    2. 轻量级通信
    3. 独立性
    4. 迭代开发。
  • 缺点:
    1. 运维成本高
    2. 分部式复杂度
    3. 接口成本高
    4. 重复性劳动
    5. 业务分离困难。

单体式服务和微服务对比

传统单体架构分布式微服务化架构
新功能开发需要时间容易开发和实现
部署不经常而且容易部署经常发布,部署复杂
隔离性故障影响范围大故障影响范围小
架构设计初期技术选型难度大设计逻辑难度大
系统性能相对时间快,吞吐量小相对时间慢,吞吐量大
系统运维运维难度简单运维难度复杂
新人上手学习曲线大(应用逻辑)学习曲线大(架构逻辑)
技术技术单一而且封闭技术多样而且容易开发
测试和差错简单复杂(每个服务都要进行单独测试,还需要集群测试)
系统扩展性扩展性差扩展性好
系统管理重点在于开发成本重点在于服务治理和调度

二、RPC协议

RPC(Remote Procedure Call Protocol) :远程过程调用协议。可以像调用本地函数一样,去调用远程函数。

  • 通过rpc协议,传递:函数名、函数参数。达到在本地,调用远端函数,得返回值到本地的目标。
  • 统一RPC框架可以统一 一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的技术劳动。

为什么微服务使用 RPC:

  1. 每个服务都被封装成 进程。彼此“独立”。
  2. 进程和进程之间,可以使用不同的语言实现。

三、GRPC协议

1. 简介

与许多RPC系统类似gRPC也基于以下理念:定义一个服务,指定其能够被远程调用的方法
在使用protobu编译服务f时,只能使用gRPC将其编译。

参考资料:
gRPC 官方文档中文版:http://doc.oschina.net/grpc?t=60133
gRPC官网:https://grpc.io


2. GRPC安装

方法1:官方推荐安装方法(需要科学上网)

go get -u -v google.golang.org/grpc

方法2:在gopath下的src\google.golang.org中执行:

git clone https://github.com/grpc/grpc-go.git
git clone https://github.com/google/go-genproto.git

生成grpc-go文件夹改名grpcgo-genproto文件夹改名genproto


验证:

服务端:
cd $gopath\src\google.golang.org\grpc\examples\helloworld\greeter_server
go run main.go

客户端:
cd $gopath\src\google.golang.org\grpc\examples\helloworld\greeter_client
go run main.go

如果报错:
dial tcp 34.64.4.113:443:
解决办法:go env -w GOPROXY=https://goproxy.cn,direct

3. GRPC使用

对proto文件进行编译

protoc --go_out=. --go-grpc_out=. ./*.proto

4. 一个小Demo

新建一个person.proto的proto文件

syntax = "proto3";

package pb;

//消息体——同一个包中不允许有同名的消息体,即使是在pb中别的proto文件中定义的

message Teacher {
	int32 age = 1;
	string name = 2;
	
}


//定义服务

service SayName {

	rpc SayHello(Teacher) returns (Teacher);
}

使用命令protoc --go_out=plugins=grpc:. *.proto编译,会自动生成peron.pb.go文件,这个生成文件不要做任何修改

写服务端,新建一个server.go文件

//定义类
type Children struct {

}

//按接口绑定类方法,重写SayHello
func (c *Children)SayHello(ctx context.Context, t *pb.Teacher) (*pb.Teacher, error) {
	t.Name += "is sleeping"
	return t, nil
}

func main()  {
	//初始化一个grpc对象 服务端
	grpcServer := grpc.NewServer()
	//注册服务端
	pb.RegisterSayNameServer(grpcServer, new(Children))
	//设置监听
	listener, err := net.Listen("tcp", "127.0.0.1:8800")
	if err != nil {
		fmt.Println("Listen err:", err)
		return
	}
	defer listener.Close()
	//启动服务
	grpcServer.Serve(listener)
}

写服务端,新建一个client.go文件

func main()  {
	//连接grpc服务
	grpcConn, err := grpc.Dial("127.0.0.1:8800", grpc.WithInsecure())
	if err != nil {
		fmt.Println("grpc Dial err:", err)
		return
	}
	defer grpcConn.Close()
	//初始化grpc客户端
	grpcCLient := pb.NewSayNameClient(grpcConn)

	teacher := pb.Teacher{
		Age:                  18,
		Name:                 "iscast",
	}

	//调用远程函数
	t, err := grpcCLient.SayHello(context.TODO(), &teacher)
	fmt.Println(t, err)
}

运行服务端和客户端

如果服务端是用两种不同的语言编写,grpc可以保证服务端和客户端的通信,protobuf可以保证两种语言之间的正常的数据交换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java + gRPC + grpc-gateway 的实践主要分为以下几个步骤: 1. 定义 proto 文件 在 proto 文件中定义需要调用的服务以及方法,同时指定请求和响应的数据类型。例如: ``` syntax = "proto3"; package example; service ExampleService { rpc ExampleMethod (ExampleRequest) returns (ExampleResponse) {} } message ExampleRequest { string example_field = 1; } message ExampleResponse { string example_field = 1; } ``` 2. 使用 protoc 编译 proto 文件 使用 protoc 编译 proto 文件,生成 Java 代码。例如: ``` protoc --java_out=./src/main/java ./example.proto ``` 3. 实现 gRPC 服务 在 Java 代码中实现定义的 gRPC 服务,例如: ``` public class ExampleServiceImpl extends ExampleServiceGrpc.ExampleServiceImplBase { @Override public void exampleMethod(ExampleRequest request, StreamObserver<ExampleResponse> responseObserver) { // 实现具体逻辑 ExampleResponse response = ExampleResponse.newBuilder().setExampleField("example").build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } ``` 4. 启动 gRPC 服务器 使用 gRPC 提供的 ServerBuilder 构建 gRPC 服务器,并启动服务器。例如: ``` Server server = ServerBuilder.forPort(8080).addService(new ExampleServiceImpl()).build(); server.start(); ``` 5. 集成 grpc-gateway 使用 grpc-gateway 可以将 gRPC 服务转换为 HTTP/JSON API。在 proto 文件中添加以下内容: ``` import "google/api/annotations.proto"; service ExampleService { rpc ExampleMethod (ExampleRequest) returns (ExampleResponse) { option (google.api.http) = { post: "/example" body: "*" }; } } ``` 在 Java 代码中添加以下内容: ``` Server httpServer = ServerBuilder.forPort(8081).addService(new ExampleServiceImpl()).build(); httpServer.start(); String grpcServerUrl = "localhost:8080"; String httpServerUrl = "localhost:8081"; ProxyServerConfig proxyConfig = new ProxyServerConfig(grpcServerUrl, httpServerUrl, "/example"); HttpProxyServer httpProxyServer = new HttpProxyServer(proxyConfig); httpProxyServer.start(); ``` 6. 测试 使用 HTTP/JSON API 调用 gRPC 服务,例如: ``` POST http://localhost:8081/example Content-Type: application/json { "example_field": "example" } ``` 以上就是 Java + gRPC + grpc-gateway 的实践步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值