目录
1.从k8s集群外访问集群内的springcloud gateway
2.springcloud gateway与其它微服务的通信方式
3.集群内的微服务之间RPC调用
上一篇文章:华为云k8s环境部署应用_wdquan19851029的专栏-CSDN博客
我们是通过ingress去访问k8s集群的,安装了ingress-nginx。
通过ingress-nginx,我们可以配置不同域名访问不同的微服务(service->pod),例如可以新增ingress对象并配置访问springcloud gateway(pod)对应的k8s service(service->pod)。
知识点:gateway在创建的时候(使用deployment controller创建)为其定义了service,gateway可以创建多个实例(比如3个),并将其所有实例注册到service的endpoints中,service起到了服务发现和负载均衡的作用。
下面的ingress对象的资源清淡文件中,定义了拥有特定域名*****.cn,path为/ 的外部请求,会被转发到为springcloud gateway对应的service(名字为***-gateway),然后这个service会将请求转发给springcloud gateway的多个实例中的一个(负载均衡,如果部署了gateway集群的话),这个service起到了服务发现和负载均衡的作用。
总结:这种情况下,从k8s集群外访问集群内的gateway(当然也可以访问其它微服务,不过绝大多数情况下,访问后端是集中访问网关),使用k8s的service做服务发现和负载均衡。
怎样从外部访问k8s集群呢?看其对应的service, 可以看到该service的对外暴露的方式是NodePort(还有其它方式,例如ClusterIP, LoadBalancer等方式)。查看service详细信息: http协议端口是30891(如下图所示: NodePort: http 30891/TCP),所以只要从集群外使用http协议访问任意Node:30891就可以,其endpoints是10.17.***.28:80
参考文章:Kubernetes Service NodePort 外网访问_富士康质检员张全蛋的博客-CSDN博客
NodePort:会在每台Node上监听端口接收用户流量,在实际情况下,对用户暴露的只会有一个IP和端口,那这么多台Node该使用哪台让用户访问呢?这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。
一般在搭建k8s集群都是放在内网当中,也就是不暴露在公网上,即使你使用了nodeport暴露了端口,但是在公网上还是访问不到的。所以必须提供公网的ip。
一般在前面加上负载均衡器来为负载均衡器提供统一的访问入口,使用负载均衡器反向代理到后面指定的端口。
一个项目对应一个service,一个service与nodeport对应。
通过nginx的虚拟主机基于域名进行分流,转发到不同的端口
upstream demo {
server 192.168.179.103:31964;
server 192.168.179.104:31964;
}
upstream demo2 {
server 192.168.179.103:31965;
server 192.168.179.104:31965;
}
upstream demo3 {
server 192.168.179.103:31966;
server 192.168.179.104:31966;
}
server {
server_name a.xxx.com;
location / {
proxy_pass http://demo;
}
}
server {
server_name b.xxx.com;
location / {
proxy_pass http://demo2;
}
}
server {
server_name c.xxx.com;
location / {
proxy_pass http://demo3;
}
springcloud gateway访问其它微服务是通过什么实现的呢?是通过k8s的service,还是nacos?
从上面的代码中可以看到,配置了3组 路由规则,其中第1、3两组加了“lb://”说明其是使用了nacos的服务发现和gateway自带的负载均衡功能。
但是第2组路由规则呢?也是使用了nacos服务发现,但是没有使用gateway的负载均衡功能,说明这组微服务并没有做集群,所以不需要负载均衡。
总结,这里也没有使用k8s的service做服务发现和负载均衡。
基础知识:gateway路由配置方法Spring Cloud Gateway--配置路由的方法_IT利刃出鞘的博客-CSDN博客_springgateway路由配置
总结:Gateway路由到其它微服务,服务发现是使用nacos,负载均衡是使用gateway自带的“lb://”。
使用openFeign或者直接使用RestTemplate
我们在代码中是怎样调用微服务的呢?
我们使用RestTemplate调用微服务, restTemplate访问的地址是 “String url = scrmSopDomain + WMATERIAL_FISSIONC;”
其中的参数“tcloud.scrm-sop-domain”是在nacos的属性文件中定义的,也就是说url是
http://scrm-sop........
那么restTemplate是怎样找到对应的微服务的呢?微服务注册到nacos的时候,会将微服务名字以及IP地址信息一起发送给nacos,调用微服务就是根据这个IP地址去找到对应的微服务,只不过这个IP地址是k8s集群内的地址,这些微服务都在k8s集群内,所以可以使用k8s集群IP相互访问。
负载均衡走的是restTemplate集成的Ribbon(openFeign集成了restTemplate和Ribbon),跟k8s的service没有关系。
总结:微服务之间通过openFeign或者restTemplate做RPC调用,服务发现是使用nacos,负载均衡是使用Ribbon。