纯干货:微服务开发手册之GRPC,再不刷题就晚了

2,客户端流模式:即从客户端往服务器端发送数据使用的是流,即服务器端的参数为流类型,然而在服务器响应后返还数据给客户端,使用的也是流的send方法。一般在服务器端的代码,需要先recv再send,而客户端与此相反。但是在后面的双向模式中可以使用go的协程协作。

3,服务器端流模式:即服务器端返回结果的时候使用的是流模式,即传入的数据是通过参数形式传入的。但是在往客户端发送数据时使用send方法,与客户端返回数据的方式大同小异。

4,双向模式:客户端如果不适用协程,那么发送必须在接收之前。如果使用协程,发送与接收并没有先后顺序。为了保证协程的同步,可以使用互斥量进行约束。

如果想要了解详细demo,可以查看gRPC 官方文档中文版

3 集成springcloud

===============

这里集成grpc建议有两种方案,

3.1 实现公共protobuf,通过java grpc来远程调用


这个方案就是不用编写protobuf了,可以直接类似dubbo一样提供java api就可以实现rpc调用,这里详情可以参考github上的demo ttps://github.com/ChinaSilence/spring-boot-starter-grpc

纯干货:微服务开发手册之GRPC

  • facade:独立的 Maven 模块,依赖 spring-boot-starter-grpc,需要远程调用的方法,都定义在此模块,形式可以为接口(interface) 或者抽象类(abstract class)

  • server:服务提供方,依赖 facade 模块,需实现 facade 模块定义的接口或者抽象类的抽象方法

  • client:服务调用方,依赖 facade 模块,使用时,直接调用即可

优缺点分析

优点:

  • 不需要编写probuff文件,以java api形式来定义接口

  • 不依赖于eureka,完美适用于k8s

缺点:

  • 只支持java,如果要支持异构语言需要使用springcloudsidecar 或者 手动注册到eureka

  • eureka支持有限,不支持负载均衡

3.2 每次使用protobuf定义接口(集成net.devh.grpc)


这里内容还比较多,详情可以参考我的博客 springcloud集成grpc(一) 这种方式集成每次都需要编写proto接口文件并自动生成代码,客户端和服务端都需要另外组装参数。

不过优势是,有详细的接口规范(protobuf),并且可以支持异构语言调用。

4 服务发现与负载均衡

===========

gRPC开源组件官方并未直接提供服务注册与发现的功能实现,但其设计文档已提供实现的思路,并在不同语言的gRPC代码API中已提供了命名解析和负载均衡接口供扩展。

其基本实现原理:

服务启动后gRPC客户端向命名服务器发出名称解析请求,名称将解析为一个或多个IP地址,每个IP地址标示它是服务器地址还是负载均衡器地址,以及标示要使用哪个客户端负载均衡策略或服务配置。

客户端实例化负载均衡策略,如果解析返回的地址是负载均衡器地址,则客户端将使用grpclb策略,否则客户端使用服务配置请求的负载均衡策略。

负载均衡策略为每个服务器地址创建一个子通道(channel)。

当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求,当可用服务器为空时客户端的请求将被阻塞。

根据gRPC官方提供的设计思路,基于进程内LB方案(即第2个案,阿里开源的服务框架 Dubbo 也是采用类似机制),结合分布式一致的组件(如Zookeeper、Consul、Etcd),可找到gRPC服务发现和负载均衡的可行解决方案。接下来以GO语言为例,简单介绍下基于Etcd3的关键代码实现:

4.1 dubbo


上面有描述,dubbo支持grpc,方案类似本文3.1提出的方案,不过是阿里提供了一整套微服务体系,包括注册中心nacas、dubbo、sentinel都支持grpc

4.2 springcloud


这个方案同样是类似3.2章,上面是集成了net.devh.grpc, 该插件最新版本,同样支持springcloud全家桶,详细可以参考github: https://github.com/yidongnan/grpc-spring-boot-starter。 如果是异构语言则需要集成springcloud中的sidecar来实现服务发现,这里也仅仅是支持java调用其他异构语言,如果需要其他语言也支持相互调用,则需要对应语言按照开源组件官方说的方案二来实现相应组件

4.3 istio


Istio是什么:Istio是Google/IBM/Lyft联合开发的开源项目,2017年5月发布第一个release 0.1.0, 官方定义为:

Istio:一个连接,管理和保护微服务的开放平台。

按照isito文档中给出的定义:

Istio提供一种简单的方式来建立已部署的服务的网络,具备负载均衡,服务到服务认证,监控等等功能,而不需要改动任何服务代码。

简单的说,有了Istio,你的服务就不再需要任何微服务开发框架(典型如Spring Cloud,Dubbo),也不再需要自己动手实现各种复杂的服务治理的功能(很多是Spring Cloud和Dubbo也不能提供的,需要自己动手)。只要服务的客户端和服务器可以进行简单的直接网络访问,就可以通过将网络层委托给Istio,从而获得一系列的完备功能。 Istio的关键功能:

  • HTTP/1.1,HTTP/2,gRPC和TCP流量的自动区域感知负载平衡和故障切换。

  • 通过丰富的路由规则,容错和故障注入,对流行为的细粒度控制。

  • 支持访问控制,速率限制和配额的可插拔策略层和配置API。

  • 集群内所有流量的自动量度,日志和跟踪,包括集群入口和出口。

  • 安全的服务到服务身份验证,在集群中的服务之间具有强大的身份标识。

可以近似的理解为:Istio = 微服务框架 + 服务治理 以下是 Istio 的官方拓扑图:

纯干货:微服务开发手册之GRPC

这里的前提是使用了k8s,在k8s中可以无缝集成istio。具体操作步骤我这里不做详细描述,详情可以参考下面链接使用Istio和Envoy实践服务网格gRPC度量

5 grpc之拦截器

==========

grpc自带认证,不过有时候也需要在调用前,或者调用后做一些操作,比如说记录监控信息、或者透传header等等,这时就需要用到grpc的拦截器,这里仅以java语言来说一下拦截器用法。

5.1 server拦截器


public class MyServerInsterceptor implements ServerInterceptor{

@Override

public <reqt, respt> ServerCall.Listener interceptCall(ServerCall<reqt, respt> call,

Metadata headers, ServerCallHandler<reqt, respt> next) {

return next.startCall(call,headers);

}

}

这里可以设置全局拦截器

@Configuration

public class GrpcOpenConfig {

//grpc-spring-boot-starter provides @GrpcGlobalInterceptor to allow server-side interceptors to be registered with all

//server stubs, we are just taking advantage of that to install the server-side gRPC tracer.

@Bean

ServerInterceptor grpcServerInterceptor() {

return new MyServerInterceptor();

}

@Bean

public GlobalServerInterceptorConfigurer globalInterceptorConfigurerAdapter(ServerInterceptor grpcServerInterceptor) {

return registry -> registry.addServerInterceptors(grpcServerInterceptor);

}

}

同时如果集成了grpc-spring-boot-starter,也可以使用@GrpcGlobalInterceptor来增加全局拦截器,hi需要将该注解加到类名上

5.2 client拦截器


public class MyClientInterceptor implements ClientInterceptor {

Metadata.Key token = Metadata.Key.of(“token”, Metadata.ASCII_STRING_MARSHALLER);

@Override

public <reqt, respt> ClientCall<reqt, respt> interceptCall(MethodDescriptor<reqt, respt> method,

CallOptions callOptions, Channel next) {

return new SimpleForwardingClientCall<reqt, respt>(next.newCall(method, callOptions)) {

@Override

public void start(Listener responseListener, Metadata headers) {

//此处为你登录后获得的token的值

headers.put(token, “A2D05E5ED2414B1F8C6AEB19F40EF77C”);

super.start(new SimpleForwardingClientCallListener(responseListener) {

@Override

public void onHeaders(Metadata headers) {

super.onHeaders(headers);

}

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

更多JVM面试整理:

面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-Fzw0HwHS-1710762558878)]

最后

2020年在匆匆忙忙慌慌乱乱中就这么度过了,我们迎来了新一年,互联网的发展如此之快,技术日新月异,更新迭代成为了这个时代的代名词,坚持下来的技术体系会越来越健壮,JVM作为如今是跳槽大厂必备的技能,如果你还没掌握,更别提之后更新的新技术了。

[外链图片转存中…(img-Ez93hxv1-1710762558878)]

更多JVM面试整理:

[外链图片转存中…(img-vomGYQBC-1710762558879)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值