一文详解gRPC快速整合SpringCloud
简介
gRPC作为新一代远程过程调用(RPC)框架,通过Protobuf序列化及二进制传输,可以高效、可扩展、可互操作的连接分布式系统,是分布式领域内受到热捧的技术。
Spring Cloud则是一种基于Spring Boot的分布式架构微服务开发工具套件,提供了服务注册、配置管理、流量控制、负载均衡等分布式开发常用的功能模组,并以组件化的方案简化开发过程,提高开发效率。
在许多场合下,我们需要整合gRPC和Spring Cloud生成新的系统,以应对更加复杂的业务场景。本文将会详细介绍如何在Spring Cloud中整合gRPC,并使用两条示例讲述具体实现流程,帮助读者更好地了解和运用相关技术。
具体实现
下面分别从gRPC Server和gRPC Client两方面进行整合。
gRPC Server整合Spring Cloud
添加依赖
spring-cloud-starter-netflix-eureka-client
: Eureka服务注册发现spring-cloud-starter-netflix-hystrix
: 集成断路器Hystrixspring-boot-starter-data-redis
: 缓存管理
编写Service
import java.util.Map;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.google.protobuf.ByteString;
import com.test.grpc.Messages.Request;
import com.test.grpc.Messages.Response;
import com.test.grpc.TestGrpc.TestImplBase;
import io.grpc.stub.StreamObserver;
@Service
public class TestService extends TestImplBase {
@Cacheable(value = "store:cache", keyGenerator = "keyGenerator")
@Override
public void httpGet(Request request,
StreamObserver<Response> responseObserver) {
Response response = Response.newBuilder()
.setMessage(ByteString.copyFromUtf8(request.getUrl() + ": Value From Basic Spring Boot Service"))
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
@Cacheable(value = "store:cache", keyGenerator = "keyGenerator")
@Override
public void httpPost(Request request,
StreamObserver<Response> responseObserver) {
Response response = Response.newBuilder()
.setMessage(ByteString.copyFromUtf8(request.getUrl() + ": Value From Basic Spring Boot Service"))
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
gRPC Client整合Spring Cloud
添加依赖
spring-cloud-starter-netflix-eureka-client
: Eureka服务发现spring-cloud-starter-openfeign
: Feign HTTP客户端spring-boot-starter-data-redis
: 缓存管理
添加配置文件
创建application.yml
文件,在其中编写如下配置:
grpc:
# x.x.x.x为gRPC Server所在的IP
host: x.x.x.x
# gRPC Server的端口号
port: 6060
eureka:
client:
service-url:
defaultZone: http://eurekaIP:8761/eureka/
feign:
hystrix:
enabled: true
完成gRPC Client
在完成上述两步之后,我们就可以通过下面的代码完成gRPC Client的相关操作。
创建Service类
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import com.test.grpc.Messages.Request;
import com.test.grpc.Messages.Response;
import io.grpc.stub.StreamObserver;
@FeignClient(name="xxx-service", url="${grpc.host}:${grpc.port}")
public interface TestService {
@PostMapping("/httpGet")
void httpGet(Request request, StreamObserver<Response> response);
@PostMapping("/httpPost")
void httpPost(Request request, StreamObserver<Response> response);
}
控制器中使用TestService
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.test.grpc.Messages.Request;
import com.test.grpc.Messages.Response;
import com.test.grpc.TestGrpc.TestBlockingStub;
import com.test.grpc.TestGrpc.TestStub;
import io.grpc.Channel;
import io.grpc.ManagedChannelBuilder;
@RestController
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/testHttpGet")
public String testHttpGet() {
Request request = Request.newBuilder()
.setUrl("http://blog.com/")
.build();
Response response = testService.httpGet(request);
return response.getMessage().toStringUtf8();
}
}
示例一:基本gRPC Server整合Spring Cloud
将以上代码导入Eclipse中并执行后,我们可以通过发送HTTP请求,访问到服务器的返回结果。
我们在浏览器中输入http://localhost:8080/testHttpGet
,可以看到浏览器返回了http://blog.com/: Value From Basic Spring Boot Service
的结果,说明gRPC Service已经成功运行。
示例二:gRPC Server整合Eureka Server
下面的示例演示了gRPC Server如何整合Eureka Server。Eureka Server用于实现gRPC Client服务的自动发现。
gRPC Server依赖及配置的添加
在pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
在application.yml文件中添加一下配置:
server:
port: 6060
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: ${eureka.instance.protocol}://${eureka.instance.hostname}:${server.port}/eureka
grpc:
port: ${server.port}
在启动主程序类上添加@EnableEurekaServer注解。
测试
将以上所有代码导入Eclipse中并执行后,我们可以通过访问Eureka Server的Web界面(默认地址为http://localhost:8761/),可以在服务列表中找到test-service
,证明Eureka Server已经成功注册了该服务。
接下来我们在例一的基础上,修改配置文件application.yml
,增加Eureka Server的地址:
grpc:
host: test-service
port: 6060
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
发送HTTP请求,可以发现我们可以自动访问到-Eureka Server中的服务。其中关于服务发现的部分的注释已经在代码中体现出来,方便大家理解。
总结
本文详细介绍了如何在Spring Cloud中整合gRPC,包括gRPC Server和gRPC Client的两个方面。通过两个具体的示例,帮助读者更好地了解和运用相关技术。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解gRPC快速整合SpringCloud - Python技术站