nacos注册grpc并实现负载均衡调用

在这里插入图片描述

前言

前面有篇文章JAVA调用go实现负载均衡(RoundRobin),这样的方式想要实现负载均衡需要配置很多ipport,显然用起来很不方便,于是想到了注册中心,把所有的grpc端口号都注册到naocs上面,通过grpc的服务名获取所有的实例,这样交给grpc去做负载均衡,然后在用spring这个胶水进行封装即可实现简单的负载均衡。

代码已经封装好了,可以参考https://github.com/fafeidou/fast-cloud-nacos/blob/master/fast-common/fast-common-grpc,下面给出封装代码的使用说明:

使用方法

添加依赖

需要依赖这个fast-common-grpc,读者可以把代码下载下来安装到本地。

		<dependency>
            <groupId>fast.cloud.nacos</groupId>
            <artifactId>fast-common-grpc</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

添加配置

需要配置grpc的端口,服务的端口,以及naocs的地址。

grpc.port=50051

server.port=8080

nacos.addr=http://127.0.0.1:8848

修改扫描配置

确定让你的程序扫描到博主写的那些配置包fast.cloud.nacos.common

@SpringBootApplication(scanBasePackages = {"fast.cloud.nacos.common","fast.cloud.nacos.grpc.example"})

添加proto文件

首先定义proto文件

syntax = "proto3";

option java_generic_services = true;
option java_multiple_files = true;
option java_outer_classname = "GrpcTestServiceProto";


service GrpcTestService {
    rpc reqString (GrpcTestService_Request_String) returns (GrpcTestService_Response_String) {};

    rpc reqStringClientStream (stream GrpcTestService_Request_String) returns (GrpcTestService_Response_String){};

    rpc reqStringServerStream (GrpcTestService_Request_String) returns(stream GrpcTestService_Response_String){};

    rpc reqStringBothStream (stream GrpcTestService_Request_String) returns(stream GrpcTestService_Response_String){};
}

message GrpcTestService_Request_String {
    string name = 1;
}

message GrpcTestService_Response_String {
    string result = 1;
}

使用ideacompile帮助你生成,这一步不在详细,可以参考【go语言专题】JAVA&GO通过GRPC互相调用,可以获取怎样生成javaidl

provider的服务注册到nacos

你需要把哪些grpc的服务注册到naocs,就需要加上
@GRpcService,这个需要实现GrpcTestServiceGrpc.GrpcTestServiceImplBase

@GRpcService
public class GrpcTestServiceImpl extends GrpcTestServiceGrpc.GrpcTestServiceImplBase {
        @Value("${grpc.port}")
    private int port;

    @Override
    public void reqString(GrpcTestService_Request_String request,
                          StreamObserver<GrpcTestService_Response_String> responseObserver) {
        String name = request.getName();
        responseObserver.onNext(GrpcTestService_Response_String.newBuilder()
                .setResult("success:" + name +"===" + "port:" + port)
                .build());
        responseObserver.onCompleted();
    }

    @Override
    public void reqStringServerStream(GrpcTestService_Request_String request,
                                      StreamObserver<GrpcTestService_Response_String> responseObserver) {
        String name = request.getName();
        responseObserver.onNext(GrpcTestService_Response_String.newBuilder().setResult("success_1:" + name).build());
        responseObserver.onNext(GrpcTestService_Response_String.newBuilder().setResult("success_2:" + name).build());
        responseObserver.onNext(GrpcTestService_Response_String.newBuilder().setResult("success_3:" + name).build());
        responseObserver.onCompleted();
    }
}

消费端实现

消费房需要给你的stub配上channel,具体实现代码如下。

@Service
public class HelloService {


    @Autowired
    ManagedChannel managedChannel;

    private GrpcTestServiceGrpc.GrpcTestServiceBlockingStub blockingStub;

    public String hello(String name) {
        GrpcTestService_Response_String grpcTestService_response_string = blockingStub.reqString(GrpcTestService_Request_String
                .newBuilder()
                .setName(name)
                .build());

        return grpcTestService_response_string.getResult();
    }


    @PostConstruct
    private void initializeClient() {
        blockingStub = GrpcTestServiceGrpc.newBlockingStub(managedChannel);
    }
}

http接口层测试

写个controller接口,用于测试。

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;

    @GetMapping("/{name}")
    public String sayHello(@PathVariable String name) {
        return helloService.hello(name);
    }
}

启动服务,访问http://localhost:8080/123,你会看到
在这里插入图片描述

负载均衡测试

在启动一个grpc端口为50052,和服务端口为8081这样访问接口会看到,5005250051会轮询访问。

上面的example也给出github地址,https://github.com/fafeidou/fast-cloud-nacos/blob/master/fast-common-examples/fast-common-grpc-example,不要忘记star,有什么问题欢迎下面评论。

参考博文

感谢参考以下大佬的博客,使我茅塞顿开。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
内部服务调用是指在一个系统内部,不同的模块或服务之间通过调用API或函数的方式进行数据传递和交互的过程。通过内部服务调用,不同的模块可以共享资源和功能,并且实现系统的整体协同工作。 Nacos是阿里巴巴开源的一款服务发现和配置管理工具。它提供了服务注册、服务发现和服务配置的功能,让微服务架构中的各个服务能够动态地注册、发现和管理。Nacos支持多种服务注册和发现方式,包括通过DNS、HTTP和gRPC等多种协议。同时,Nacos还能够提供动态配置管理功能,可以帮助开发人员对各个服务的配置进行统一管理和动态更新。 内部服务调用Nacos的关系在于,Nacos可以作为内部服务调用的服务治理工具。通过Nacos提供的服务注册和发现功能,不同的模块可以方便地找到需要调用的服务,并进行可靠的远程调用。此外,Nacos还能够提供服务的负载均衡和故障转移功能,可以确保内部服务调用的高可用性和稳定性。另外,Nacos还能够作为内部服务调用的配置中心,帮助开发人员对各个模块的配置进行统一管理和动态更新。 总之,内部服务调用是微服务架构中不同模块之间进行数据传递和交互的过程,而Nacos是一款服务发现和配置管理工具,在内部服务调用中可以发挥服务注册、发现、负载均衡和配置管理的作用,帮助开发人员更好地进行内部服务调用的治理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值