grpc-java k8s下的负载均衡处理方法

目录
  • 前言
  • 现状
  • 负载均衡的方案
    • 一、客户端dns模式
    • 二、客户端注册中心模式
    • 三、代理端走ingress
    • 四、代理端servicemesh
  • 结语

前言

grpc 因为是长连接的,所以负载均衡处理起来没有 rest 接口那么容易。常见的 grpc 负载均衡方法分为两类,一类是客户端侧实现负载逻辑,一类是代理侧实现负载逻辑,对客户端侧是透明的。在容器化的网络环境里, grpc-java 客户端侧的负载均衡有两种常见的实现路径。

1、基于 dns 实现,

2、基于外部的服务注册中心实现(ZooKeeper/Etcd/Consul/Eureka)。

本文旨在,在容器化的网络环境下,通过测验寻找一种改造成本最小的实现负载均衡的途径

现状

在 k8s 的网络环境下,一个 grpc 的服务,同一个 namespace 下,可以直接通过 service 访问,不同的 namespace 可以通过 service.namespace 访问。但是,经验证,这种直连的方式没法做到负载均衡,也就意味着 server 端无论开启了多少个 pod 实例,客户端也只能连接一个pod 。所以,在客户端和服务端数量不对等时,打到 server 侧的流量会非常的不均衡,如果数量对等,情况稍微好些。本次测验只测试了 java 链接 java 的 grpc 服务,生产环境的实际调用场景会更复杂,包含了 php 、go、java 三种 grpc 服务的相互调用

负载均衡的方案

一、客户端 dns 模式

dns 的模式是 grpc-java 实现复杂均衡改造成本最小的。应该也是最通用的,各个语言的 grpc  应该都有支持。主要改动两个地方,

1、修改 Service 的 spec.clusterIP 为 ”None“,如:

apiVersion: v1
kind: Service
metadata:
  namespace: tap-prod
  name: queuing-rpc
  labels:
    app: queuing-rpc
spec:
  clusterIP: None
  ports:
    - port: 8030
      targetPort: 8030
      name: grpc
  selector:
    app: queuing-rpc

改动后,可以通过 service 的名称解析到 pod 的 ip 列表

2、配置的 grpc 链接协议头加上 dns 协议,如:

grpc.client.store.address = dns:///store-rpc:8020

二、客户端注册中心模式

客户端注册中心模式相比较 dns 模式,实现方式上相对复杂点,但是灵活度更高了,有了注册中心后,服务治理相关的也就都可以做了。但是在多语言的场景下,这种方式的普及难度会更高,无论选择哪个注册中心实现,都必须要求其他语言也要对应实现。这里只简要阐述 grpc-java 的实现途径

。grpc-java 客户端提供了 NameResolver 、NameResolverProvider 、NameResolverRegistry 等实现服务注册发现的扩展类。结合注册中心 ZooKeeper/Etcd/Consul/Eureka ,很容易实现一个基于注册中心的带服务治理的 grpc 。

三、代理端走 ingress

nginx-ingress-controller 从 0.30.0 版本开始支持 grpc 的流量代理,经测验,在 nginx-ingress 代理模式下,grpc 的流量是负责均衡的。这种改动方式也比较简单,服务方只需要新增一个 ingress 代理 grpc 流量即可,客户端链接是无感的,不需要做任何改动。因为走了一层代理,性能上会比dns 模式差点

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  namespace: tap-prod
  name: store-rpc
  annotations:
    kubernetes.io/ingress.class: nginx-intranet-grpc
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
spec:
  rules:
    - host: store-rpc.xx.com
      http:
        paths:
          - backend:
              serviceName: store-rpc
              servicePort: 8020

四、代理端 service mesh

需要引入 istio 等服务网格架构。这种模式,对于多语言微服务环境是非常友好的,可以屏蔽各种语言基础服务治理的实现细节,应该是最终目标方案。

结语

短期而言,需要解决 grpc 负载均衡问题,最快速、最无感的方案是基于 ingress 的代理负载模式。改动小、性能好的方案应该是客户端基于 dns 的模式。最复杂、最灵活、可控度最高的应该是基于客户端注册中心的实现方式。综合起来看,service mesh 的方式才是最终的目标,不仅解决服务负载问题,流量观测、服务治理也统统解决了

参考:

以上就是grpc-java k8s下的负载均衡处理方法的详细内容,更多关于grpc-java k8s负载均衡的资料请关注我们其它相关文章!

(0)

相关推荐

  • k8s部署java项目的实现

    下载jar的包 [root@master test]# wget https://dl.halo.run/release/halo-1.4.16.jar [root@master ~]# ls anaconda-ks.cfg flannel.yml halo-1.4.16.jar init [root@master ~]# 编写Dockerfile并制作镜像 [root@master ~]# mkdir -p test/files [root@master ~]# mv halo-1.4.16.

  • 一篇文章搞懂K8S高级特性

    目录 K8S高级特性 高级特性 总结 kubectl排查服务问题 K8S真的放弃Docker了吗? K8S高级特性 K8S中还有一些高级特性有必要了解下,比如弹性扩缩应用(见上文).滚动更新(见上文).配置管理.存储卷.网关路由等. 在了解这些高级特性之前有必要先看几个K8S的核心概念: ReplicaSet ReplicaSet确保任何时间都有指定数量的Pod副本在运行.通常用来保证给定数量的.完全相同的Pod的可用性.建议使用Deployment来管理ReplicaSet,而不是直接使用.

  • golang grpc 负载均衡的方法

    微服务架构里面,每个服务都会有很多节点,如果流量分配不均匀,会造成资源的浪费,甚至将一些机器压垮,这个时候就需要负载均衡,最简单的一种策略就是轮询,顺序依次选择不同的节点访问. grpc 在客户端提供了负载均衡的实现,并提供了服务地址解析和更新的接口(默认提供了 DNS 域名解析的支持),方便不同服务的集成 使用示例 conn, err := grpc.Dial( "", grpc.WithInsecure(), // 负载均衡,使用 consul 作服务发现 grpc.WithBal

  • Kubernetes(K8S)容器集群管理环境完整部署详细教程-上篇

    Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes通常结合docker容器工具工作,并且整合多个运行着docker容器的主机集群,Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术.Kubernetes是一个用于容器集群的自动化部署.扩容以及运维的开源平台. 本文系列: Kubernetes(K8S)容器集群管理环境完整部署详

  • Java Grpc实例创建负载均衡详解

    Grpc是googe开发的,是一款语言中立.平台中立.开源的远程过程调用(RPC)系统.新公司的项目服务之间的调用使用的Grpc来实现服务间的调用,这边一开始接到的工作内容是基于Nginx实现Grpc服务端的负载均衡.Nginx的1.13及以上版本是支持grpc的反向代理和负载均衡的.但是公司的nginx服务器的版本是1.10的,所以没办法直接使用grpc的代理.只能使用更底层的tcp层的负载均衡.最终服务跑起来是感觉挺简单的,但是nginx的基础太差,所以过程有点曲折.还是记录下吧. 文章分两

  • grpc-java k8s下的负载均衡处理方法

    目录 前言 现状 负载均衡的方案 一.客户端dns模式 二.客户端注册中心模式 三.代理端走ingress 四.代理端servicemesh 结语 前言 grpc 因为是长连接的,所以负载均衡处理起来没有 rest 接口那么容易.常见的 grpc 负载均衡方法分为两类,一类是客户端侧实现负载逻辑,一类是代理侧实现负载逻辑,对客户端侧是透明的.在容器化的网络环境里, grpc-java 客户端侧的负载均衡有两种常见的实现路径. 1.基于 dns 实现, 2.基于外部的服务注册中心实现(ZooKee

  • Windows下Apache+Tomcat7负载均衡配置方法详解

    准备工作 Windows Server 2008 R2 Enterprise(2.40GH,8GB,64Bit,192.168.10.212) 2台Ubuntu 10.04.4(192.168.10.98,192.168.10.137) JDK1.7.80 Tomcat7.0.68 Apache2.4.4 1.安装Apache2.4.4 安装过程中没什么注意事项,一直Next就行了.安装完成后默认开启Apache服务,可以在浏览器上输入localhost或者127.0.0.1,这时候会出现It

  • Java使用Gateway自定义负载均衡过滤器

    背景 最近项目中需要上传视频文件,由于视频文件可能会比较大,但是我们应用服务器tomcat设置单次只支持的100M,因此决定开发一个分片上传接口. 把大文件分成若干个小文件上传.所有文件上传完成后通过唯一标示进行合并文件. 我们的开发人员很快完成了开发,并在单元测试中表现无误.上传代码到测试环境,喔嚯!!!出错了. 经过一段时间的辛苦排查终于发现问题,测试环境多实例,分片上传的接口会被路由到不同的实例,导致上传后的分片文件在不同的机器,那么也就无法被合并. 知道了原因就好解决,经过一系列的过程最

  • 使用Java实现5种负载均衡算法实例

    目录 前言 概念 几种负载均衡算法图例 轮询算法 加权轮询法 加权随机法 随机法 IP_Hash算法 总结 前言 负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给各个server.其中有好几个种经典的算法.在用java代码编写这几种算法之前,先来了解一下负载均衡这个概念. 概念 负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server.其中有好几个种经典的算法,下面我们用Java实现这几种算法. 几种负载均衡算法图例 主要的负载均衡算法是图中这些,在代码

  • Java实现5种负载均衡算法(小结)

    目录 概念 轮询算法 加权轮询法 加权随机法 随机法 IP_Hash算法 概念 负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个server.其中有好几个种经典的算法,下面我们用Java实现这几种算法. 轮询算法 轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器. 优点:绝对公平 缺点:无法根据服务器性能去分配,无法合理利用服务器资源. package com.monkeyjava.learn.basic.robin; import com.goog

  • k8s 中的 service 如何找到绑定的 Pod 及实现 Pod 负载均衡的方法

    目录 k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 endpoint kube-proxy userspace 模式 iptables ipvs kernelspace 服务发现 环境变量 DNS 总结 参考 k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 前言 Service 资源主要用于为 Pod 对象提供一个固定.统一的访问接口及负载均衡的能力. service 是一组具有相同 label pod 集合的抽

  • nginx+tomcat实现Windows系统下的负载均衡搭建教程

    刚入行没多久就听过'负载均衡'的大名,到现在因为工作接触的少,所以没什么太多的认识.但自己又对其非常的好奇,所以前两天通过查资料,在自己的笔记本上就搭建了一个超简单的案例(工作中没有时间,晚上到家了条件又不够,只能用自己的笔记本将就一下了,重在理解思想..) 通俗点将,负载均衡就是因为访问流量太大,导致项目访问不流畅.甚至宕掉,所以通过一种分流的方式来缓解这种情况. 首先,安装两个tomcat,可以是同一个复制成两个,也可以下载两个不同版本的tomcat,我就是下载了两个不同版本的.下载地址:h

  • Java 处理高并发负载类优化方法案例详解

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves

  • Spring Cloud Ribbon实现客户端负载均衡的方法

    简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负担.客户端负载均衡是运行在客户端程序中的,如我们的web项目,然后通过获取集群的IP地址列表,随机选择一个server发送请求.相对于服务端负载均衡来说,它不需要消耗服务器的资源. 基础环境 JDK 1.8 Maven 3.3.9 IntelliJ 2018.1 Git:项目源码 更新配置 我们这次

随机推荐