7、接下来就是才是比较关键的一步,实现自己的grpc服务端的业务代码。主要的关键步骤就是继承grpc自动映射出来的抽象类。是不是很熟悉,没错就是proto文件里面配置的服务。然后重写服务里面配置的方法即可。最后放心大胆的去根据传递的request参数去做相关的业务逻辑的处理。并用response封装需要返回的接口。(此处的request与response均是grcp根据proto配置文件映射出来的相关实体类。)
package service;
import com.qidai.proto.MyRPCGrpc.MyRPCImplBase;
import com.qidai.proto.MyThing.Response;
public class RequestImpl extends MyRPCImplBase {
@Override
public void sayHi(com.qidai.proto.MyThing.Request request,
io.grpc.stub.StreamObserver<com.qidai.proto.MyThing.Response> responseObserver) {
//proto文件上定义的response返回信息
Response response;
System.out.println("Request>>>say::" + request.getName());
//AccountQryResponse response = QryAccountProto.AccountQryResponse.newBuilder().setRc(1).setAmount(666).build();
response = Response.newBuilder().setName("Response11111>>>say:::hello_client"+request.getName()).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
二、Grpc服务基于nginx(1.12.2)实现负载均衡。下面直接贴nginx相关的配置,服务端和客户端的代码改动都很小。只需调整ip和port的值即可。其他的不需要改动。
TCP层负载均衡配置
stream {
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
include ./conf.d/*.tcpstream;
upstream grpc {
server 127.0.0.1:2223;
server 127.0.0.1:2222;
}
server {
error_log logs/device5001_error.log;
access_log logs/device5001_access.log proxy;
listen 5005;
proxy_pass grpc;
}
}
grpc的负载均衡配置(grpc的支持在nginx1.13之后才有,所以这里是1.17.0)
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
upstream grpcservers {
server 127.0.0.1:2222;
server 127.0.0.1:2223;
}
server {
listen 8080 http2;
server_name localhost;
location / {
grpc_pass grpc://grpcservers;
}
}
}
最后分别启动nginx1.12.2和nginx1.17.0,并在ide上启动服务端和客户端,更改相应的客户端端口。就可以看到控制台打印不同的信息了。tcp和grcp的负载均衡的效果是不一样的。这也是我客户端new 了一个client,然后又new 了一个client2的原因。比较懒,效果图就不贴了。










