KiteX 基于 K8s 的服务注册与发现

点击上方蓝色字体,选择“设为星标”

回复”云原生“获取基础架构实践

8fed2b0cc04d5307ee00f4ded5c5deef.jpeg

概览

在很久之前的文章中说过,K8s 作为云原生时代的创造者,下一代云原生的中间利器,从云原生 1.0 到 2.0,作为基石,成就无数服务畅游每一台机器。前面的文章 KiteX 入门篇 介绍了如何简单的开发一个高性能 RPC 微服务,并且我们看到其性能与吞吐还是不错的。但需要中间件 Nacos 来连接服务端与客户端。今天,我们主要从 K8s 角度来看 Kitex 如何接入云原生,甚至后面的 Istio。

实践

服务端

前面文章 KiteX 入门篇,我们介绍了如何创建一个服务端,那我们这次改造下,让其接入 K8s。

这里主要现需要去掉关于 Nacos 的逻辑,然后我们再看下面的代码:

server.WithServiceAddr(&net.TCPAddr{Port: 9000}),

这段代码的含义是通过 Nacos 注册时候,我们把服务注册的端口为 9000,但如果服务是以 K8s 部署的 Pod 形式,则代表的是 Pod 的端口,同时,由于 K8s 这种开源注册中心默认使用 TCP 协议,所以这里支持的是 TCP 协议。这样简单的配置,即可让服务注册到 K8s,被 k8s-api 发现。

完整代码如下:

svr := note.NewServer(
  new(api.NoteApi),
  //基于svc进行服务注册,9000为svc的port
  server.WithServiceAddr(&net.TCPAddr{Port: 9000}),
  server.WithMuxTransport(),
  server.WithLimit(&limit.Option{MaxConnections: 10000, MaxQPS: 5000}),

  server.WithPayloadCodec(thrift.NewThriftCodecWithConfig(thrift.FastRead | thrift.FastWrite)),

  //server.WithTracer(prometheus.NewServerTracer(":9092", "/kitexNoteserver")),

  server.WithErrorHandler(func(err error) error {
   error := errno.ConvertErr(err)
   return error
  }),
  server.WithCodec(codec.NewDefaultCodecWithSizeLimit(1024 * 1024 * 10)),//10M

  server.WithMetaHandler(transmeta.ServerTTHeaderHandler),                                            // registry
 )
 err := svr.Run()
 if err != nil {
  klog.Fatal(err)
 }
部署脚本

由于我们需要通过镜像部署服务,所以需要 dockerfile:

FROM ubuntu:16.04 as build

RUN apt-get update && apt-get install -y --no-install-recommends \
        g++ \
        ca-certificates \
        wget && \
    rm -rf /var/lib/apt/lists/*


ENV GOLANG_VERSION 1.18.1
RUN wget -nv -O - https://studygolang.com/dl/golang/go1.18.1.linux-amd64.tar.gz \
     | tar -C /usr/local -xz

ENV GOPROXY=https://goproxy.cn,direct
ENV GO111MODULE=on
ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN apt-get update && apt-get install -y git

WORKDIR /go/src

COPY . .
#RUN go env -w GOPROXY=https://goproxy.cn,direct
#RUN go env -w GO111MODULE=on

RUN go build -o hello-server  ./server/hello
RUN chmod +x ./hello-server

RUN rm -rf cache && rm -rf kitex_gen && rm -rf README.md\
&& rm -rf build && rm -rf codec && rm -rf client \
&& rm -rf images && rm -rf idl && rm -rf go.mod  && rm -rf go.sum \
&& rm -rf pkg && rm -rf script && rm -rf retry \
&& rm -rf server && rm -rf streaming && rm -rf LICENSE

CMD ["./hello-server"]

然后我们需要 K8s 的 yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-service-deployment
  namespace: default
  labels:
    app: hello-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-service
  template:
    metadata:
      labels:
        app: hello-service
    spec:
      nodeSelector:
        hello-service: "true"
      containers:
        - name: node-service
          image: node-service
          imagePullPolicy: IfNotPresent
          ports:
            - name: hello01
              containerPort: 9000

              ......

最后需要对这个服务进行创建 svc,以便进行负载均衡被其它服务所访问。

apiVersion: v1
kind: Service
metadata:
  name: hello-service-svc
  namespace: default
spec:
  ports:
    - name: hello01
      port: 9000
      targetPort: hello01
  selector:
    app: hello-service

此时,一个完整的服务端的代码以及部署脚本就完结了。

客户端

同样的,客户端我们来看看看,也是很简单,同样先需去掉 Nacos 的配置,然后我们引入利用 K8s svc 进行服务的请求:

client.WithHostPorts("hello-service-svc.default.svc.cluster.local:9000"),

在创建客户端的时候,客户端的 host 要写实际集群中的内网地址:hello-service-svc.default.svc.cluster.local,这样就不用再搭配第三方的服务注册中心了。

这样就可以通过该 host 进行访问服务端的服务了。。。

部署脚本

客户端的部署脚本类似服务端的,同样需要部署的构建镜像脚本、部署 deployment 脚本、部署 svc。此处客户端由于是通过容器部署,所以我们需要把其服务的 port 进行映射到主机,这样方便来进行浏览器访问服务:

apiVersion: v1
kind: Service
metadata:
  name: customer-service-svc
  namespace: default
spec:
  type: NodePort
  ports:
    - name: customer01
      nodePort: 30230
      port: 3000
      targetPort: customer01
  selector:
    app: customer-service

测试

我们先通过命令进行部署:

kubectl create -f ...

创建完服务相关资源后,我们看看 pod:

KiteX 基于 K8s 的服务注册与发现_第1张图片

资源 svc 情况:

3c817fa51e3567e39d03669ecd708f52.png

我们把 port 映射到主机上,然后我们通过浏览器进行访问客户端,此处我们访问的是存在 10000 条数据入库的服务:

KiteX 基于 K8s 的服务注册与发现_第2张图片

我们可以看到,数据大概是 9634 条总数,我们取 500 条,耗时 40ms,接下来,我们换作取 5000 条:

KiteX 基于 K8s 的服务注册与发现_第3张图片

数据大小 624kb,发现大概耗时:159ms,还是可以的。

最后,我们看看拿全部数据大概耗时:

KiteX 基于 K8s 的服务注册与发现_第4张图片

发现全部数据大小:1.2M,耗时 300 多毫秒,还是不错的。

特性

我们的服务为什么能如此之快呢,这里我们引入了一种高性能网络库:netpoll,以及在编解码方面,我们利用 Thrift 的 IDL 进行生成代码,同时,利用其提供的 FastRead、FastWrite 来进行快速传输。

如有想要源码的,可以关注后,后台联系博主获取哟~

号内回复“云原生”,获取云原生基础架构实践电子书

KiteX 基于 K8s 的服务注册与发现_第5张图片

云原生社区合肥站

云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~

详情参见Issue:https://github.com/cloudnativeto/community/issues/107

欢迎关注个站:damon008.github.io

往期回顾

微服务自动化部署CI/CD

如何利用k8s拉取私有仓库镜像

个站建设基础教程

ArrayList、LinkedList 你真的了解吗?

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

微服务架构设计之解耦合

浅谈负载均衡

Oauth2的认证实战-HA篇

Oauth2的授权码模式《上》

浅谈开发与研发之差异

浅谈 Java 集合 | 底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

KiteX 基于 K8s 的服务注册与发现_第6张图片

fd1a228f4021f183a033cd81d6fdc72f.gif

点击 "damon008.github.io" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️

你可能感兴趣的:(docker,java,kubernetes,ribbon,中间件)