基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡

这篇具有很好参考价值的文章主要介绍了基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1. 前言

本文主要讨论通过grpc-java开发的普通的java grpc工程,以多实例的方式部署在容器编排平台kubernetes(以下简称k8s)上,如何能够实现让同样部署在k8s
集群内的客户端请求流量均衡的分发到多个grpc应用部署实例上去。

2.实现方案要点

  • grpc服务端程序在k8s内部署的多个实例通过headless service暴露服务
  • grpc客户端程序显示指定负载均衡策略为round_robin
  • grpc客户端程序在创建channel时显示在service名称前加上dns:///(比如 dns:///service.ns)
  • grpc-java的版本要不低于1.38

3.具体实现步骤

3.1 编写一个grpc服务端程序(详细实现步骤在此忽略,网上很多例子)


  package com.example.grpcserver;
  
  import io.grpc.Server;
  import io.grpc.ServerBuilder;
  import java.io.IOException;
  public class ProductInfoServer {
  Server server;
  
      public static void main(String[] args) {
          ProductInfoServer productInfoServer = new ProductInfoServer();
          productInfoServer.startServer();
          productInfoServer.blockUntilShutdown();
      }
  
      private void startServer(){
  
          int port = 50501;
          try {
              server = ServerBuilder.forPort(port).addService(new ProductInfoImpl()).build().start();
              Runtime.getRuntime().addShutdownHook(new Thread( ()-> {
                  ProductInfoServer.this.stop();
              }));
          } catch (IOException e) {
              throw new RuntimeException(e);
          }
      }
  
      private void stop(){
          if(server != null){
              server.shutdown();
          }
      }
  
      private void blockUntilShutdown(){
          if (server != null){
              try {
                  System.out.println("begin =====server.awaitTermination();");
                  server.awaitTermination();
                  System.out.println("end =====server.awaitTermination();");
              } catch (InterruptedException e) {
                  throw new RuntimeException(e);
              }
          }
  
      }
  
  }

3.2 编写grpc客户端程序,注意指定负载均衡策略和dns:///这个URI前缀,如下图所示

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器

部分源码:

package com.example.grpccli;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import org.javaboy.grpc.demo.Product;
import org.javaboy.grpc.demo.ProductId;
import org.javaboy.grpc.demo.ProductInfoGrpc;

public class ProductClient {

    public static void main(String[] args) {
        // 请注意此处是要连接的service暴露的端口
        int port = 50501;
        String serverAddr = "grpc-server-headless-srv.platform";
        String dnsAddr = "dns:///"+serverAddr+":"+port;
        System.out.println("dnsAddr: " + dnsAddr);
        ManagedChannel managedChannel = ManagedChannelBuilder.forTarget("dns:///"+serverAddr+":"+port)
                .defaultLoadBalancingPolicy("round_robin").usePlaintext().build();
        ProductInfoGrpc.ProductInfoBlockingStub stub = ProductInfoGrpc.newBlockingStub(managedChannel);

        // 循环分别创建和查询100次产品
        for(int i=0; i<100; i++){
            Product product = Product.newBuilder().setId("" + i).
                    setName("TH项目-" + i).
                    setPrice(i).
                    setDescription("grpc实战项目-" + i).
                    build();

            // 添加产品
            ProductId id = stub.addProduct(product);
            System.out.println("我是增加产品: "+ id.getValue());

            // 查询产品
            Product prd = stub.getProduct(ProductId.newBuilder().setValue("" + i).build());
            System.out.println("我是查询产品:" + prd.toString());
        }


    }

}

3.3 在k8s中部署服务端和客户端

此处直接使用Kubesphere平台进行部署

3.3.1 服务端部署2个实例

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器

3.3.2 通过headless服务将服务端服务暴露出来

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器

3.3.3 客户端部署一个实例

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器

注意客户端代码此处URI配置为(dns:///service:port)

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器

3.3.4 进入客户端容器命令行进行测试

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器

3.3.5 分别查看两个客户端接受到的请求流量

服务端实例1和服务端实例2各接收到客户端50%的请求流量

基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器
基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡,rpc,java,负载均衡,rpc,kubernetes,容器文章来源地址https://www.toymoban.com/news/detail-797055.html

到了这里,关于基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

    【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

    一开始了解到Java Api库操作k8s集群,有两个,分别为: kubernetes-client/java fabric8io/kubernetes-client 但个人对比使用了两个发现,还是 fabric8io更易用 ,用的人多是有道理的, fabric8io和yaml文件十分贴切 ,所以 通俗易懂 。本文前提是已配置好集群,已经熟悉了kubectl工具常用命令。

    2024年02月02日
    浏览(14)
  • K8S认证安全工程师(CKS)考试(最新版,实测可靠)

    k8s的全部考试答案,亲测可靠,博主CKA,CKS已过,欢迎交流。(求个关注吧) 1、kube-bench 修复不安全项 Context 针对 kubeadm 创建的 cluster 运行 CIS 基准测试工具时,发现了多个必须立即解决的问题。 Task 通过配置修复所有问题并重新启动受影响的组件以确保新的设置生效。 修复

    2024年04月13日
    浏览(13)
  • java 对接 k8s API、K8s基本架构、k8s常用命令

    引言: 当容器部署涉及到 多个节点 服务器,用docker、docker-compose 来部署就不是那么方便了,不能统一控制,不方便伸缩,配置统一管理、版本控制;当我们业务涉及到集群容器部署时,就考虑K8s、K3s 来实现。 k8s 架构组成: (一)Master :apiserver、scheduler、controller-manager 以

    2024年02月16日
    浏览(13)
  • Prometheus+Grafana监控K8S集群(基于K8S环境部署)

    Prometheus+Grafana监控K8S集群(基于K8S环境部署)

    1、服务器及K8S版本信息: IP地址 主机名称 角色 K8S版本 16.32.15.200 master-1 Master节点 v1.23.0 16.32.15.201 node-1 Node节点 v1.23.0 16.32.15.202 node-2 Node节点 v1.23.0 2、部署组件版本: 序号 名称 版本 作用 1 Prometheus v2.33.5 收集、存储和处理指标数据 2 Node_exporter v0.16.0 采集服务器指标,如CP

    2024年02月04日
    浏览(17)
  • [k8s] 基于ubuntu22部署k8s1.28记录

    k8s1.28部署已经不依赖docker了,所以不需要安装docker。同理:如果想查看镜像和运行容器,也不能用docker命令去查询了:需要使用crictl。不过crictl命令参数兼容docker,所以使用上手没有啥难度。 根据k8s官方文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kube

    2024年02月11日
    浏览(14)
  • 【K8S&RockyLinux】基于开源操作系统搭建K8S高可用集群(详细版)

    【K8S&RockyLinux】基于开源操作系统搭建K8S高可用集群(详细版)

    角色 主机名 IP地址 系统版本 CPU/MEM master m1 192.168.200.61 Rocky Linux 8.5 2C/2GB master m2 192.168.200.62 Rocky Linux 8.5 2C/2GB master m3 192.168.200.63 Rocky Linux 8.5 2C/2GB node n1 192.168.200.64 Rocky Linux 8.5 2C/4GB node n2 192.168.200.65 Rocky Linux 8.5 2C/4GB node n3 192.168.200.66 Rocky Linux 8.5 2C/4GB VIP 192.168.200.68 !!!注意

    2024年02月09日
    浏览(12)
  • 基于rancher搭建k8s

    基于rancher搭建k8s

    -v 用来挂载证书,如果没有证书,可以删除,默认使用rancher内置的自签证书 rancher启动较慢,可以稍等片刻,大约半分钟,即可访问。前提是防火墙放行端口10443 浏览器访问到rancher的登录页面后,执行 docker logs rancher 21 | grep \\\"Bootstrap Password:\\\" 查看默认的登录密码 由于docker r

    2024年02月12日
    浏览(10)
  • k8s的jenkins部署java项目到k8s集群cicd持续集成

    k8s的jenkins部署java项目到k8s集群cicd持续集成

    k8s1.16.0-k8s的jenkins部署java项目到k8s集群cicd(ci成,cd手动部署的) 注意: 本文档只是实现了ci,cd是通过ci生成的镜像,再手工再k8s-master执行的部署(只因pod部署的jenkins连接k8s的认证不知怎么操作,若jenkins是单独部署在k8s-master机器上,能直接在master执行kubectl命令就没这个问题了

    2024年02月03日
    浏览(20)
  • 基于kubeadm部署K8S集群

    基于kubeadm部署K8S集群

    目录 基于kubeadm部署K8S集群 一、环境准备 1、主机初始化配置 2、配置主机名并绑定hosts,不同主机名称不同 3、主机配置初始化 二、部署docker环境 1、三台主机上分别部署 Docker 环境 2、镜像加速器(所有主机配置) 三、部署kubernetes集群 (一)组件介绍 (二)配置阿里云yu

    2024年02月13日
    浏览(21)
  • 基于Centos搭建k8s仓库

    系统环境: Red Hat Enterprise Linux 9.1 (Plow)      Kernel: Linux 5.14.0-162.6.1.el9_1.x86_64 主机名 地址 master 192.168.19.128 node01 192.168.19.129 node02 192.168.19.130 目录 1、关闭防火墙,关闭SElinxu ,开启时间同步服务 2、关闭swap 3、网络参数调整 4、建立仓库 6、下载必要的软件包 7、启动服务 8、重

    2024年02月11日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包