关于开发部署中(4层7层C端S端)软负载均衡笔记

关于开发部署中(4层7层C端S端)软负载均衡笔记,第1张

关于LVS 和 kube-proxy、F5 我们这里之后在和小伙伴分享, F5 没有接触过, LVS 的demo容器的方式一直没有成功, kube-proxy 这一块我还没学到,只是简单的了解.

如果能深刻理解苦难,苦难就会给人带来崇高感 。 ——路遥

处理传输层到应用层的数据,为了能通一个URL或者IP+PORT将前端的访问分发到后台的多个服务器上

Dev 即开发角度的负载均衡。开发中的负载均衡一般是在 微服务 中涉及。服务提供方一般以多实例的形式提供服务, 负载均衡功能能够让服务调用方连接到合适的服务节点 。 并且, 服务节点选择的过程对服务调用方来说是透明的 。

所以这里理解为是客户端的负载均衡,是相对服务端负载均衡而言。

客户端负载均衡来讲,就是调用的客户端本身是知道所有服务信息,当需要调用服务上的接口的时候,客户端从自身所维护的服务列表中,根据提前配置好的负载均衡策略,自己挑选一个服务来调用,此时,客户端知道它所调用的是哪一个服务.

在 Spring Cloud 中使用在 RestTemplate 进行服务调用,要想使用负载均衡功能,需要使用 Spring Cloud Ribbon 。

Spring Cloud Ribbon 是一个基于HTTP和TCP的客户端负载均衡工具,它基于 Nettlix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。

使用时需要给 RestTemplate 实例上添加一个 @LoadBalanced 注解即可,此时, RestTemplate 就会自动具备负载均衡功能,这个 负载均衡 就是 客户端负载均衡 。

Ops 即运维角度的负载均衡,这里的负载我们也称为服务端负载

所谓服务端负载均衡,比如传统的Nginx的方式,调用的客户端并不知道具体是哪个服务提供的服务,它也不关心,反正请求发送给Nginx, 或者hyproxy作为代理的服务器,然后 Ngixn 在请求负载任意服务,客户端只需要记着Nginx的地址即可。

Nginx 7层负载是最常见的一种负载,所谓7层负载,即应用层负载,即基于应用层协议(TELNET,SSH,HTTP,SMTP,POP…)做的代理,7层负载需要解析数据包的具体内容,需要消耗额外的cpu,然后根据具体内容(url, 参数, cookie, 请求头)匹配相应的路径,然后转发到相应的服务器。转发的过程是:建立和目标机器的连接,然后转发请求,收到响应数据再转发给请求客户端。

使用docker构建一个内部网络

内网里运行两个httpd服务

10.1.1.22

10.1.1.33

Ngixn实现到上面两个httpd服务的负载

运行Nginx容器

测试一下

所谓四层负载,即在传输层协议的基础上来做负载,基于TCP,UDP等协议,传输层的作用是确保数据被可靠的传输送到目标地址,能够让应用程序之间实现通信,所以彼此传递的是数据包,标识的只有IP+端口。不涉及具体的url其他结构解析。路径匹配等,不会涉及具体的应用层协议,所以理论上四层负载要比七成负载快。

nginx 四层代理是nginx1.9.0开始新增的功能,需要开启 --with-stream 模块,可以实现四层协议的转发、代理、负载等功能

这里的话,我们还是用容器的方式。配置方式和七层主要是配置文件的区别

启动4层负载的Nginx

测试一下

HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 会话保持 或 七层处理 。HAProxy完全可以支持数以万计的并发连接。

这里我们还用之前的连个httpd服务演示

haproxy.cfg配置文件

测试下

四层负载和七层负载也是配置文件的区别

运行容器并测试

Spring3.0引入了RestTemplate,但是在后来的官方源码中介绍,RestTemplate有可能在未来的版本中被弃用,所谓替代RestTemplate,在Spring5中引入了WebClient作为非阻塞式Reactive Http客户端。

采用阻塞IO模式获取输入数据。每个连接都需要独立的线程,完成数据输入、业务处理、返回。传统阻塞IO模型的问题是,当并发数很大时,就要创建大量线程,占用很大的系统资源。连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read *** 作,造成线程资源浪费。

SpringMVC或Struct等框架都是基于Servlet的,其底层IO模型是阻塞IO模型。Spring社区为了解决SpringMVC的阻塞模型在高并发场景下的性能瓶颈,推出了Spring WebFlux,WebFlux底层实现是久经考验的Netty非阻塞IO通信框架。其实WebClient处理单个HTTP请求的响应时长并不比RestTemplate更快,但是它处理并发的能力更强。 所以响应式非阻塞IO模型的核心意义在于,提高了单位时间内有限资源下的服务请求的并发处理能力,而不是缩短了单个服务请求的响应时长。

uriBuilderFactory:自定义UriBuilderFactory灵活配置使用Url

defaultHeader:为HTTP请求设置Headers请求头

defaultCookie:为HTTP请求设置Cookies

defaultRequest:自定义HttpRequest

filter:为HTTP请求增加客户端过滤器

exchangeStrategies:HTTP读写信息自定义

clientConnector:HTTP客户端连接器设置

使用Mono和Flux接收返回结果,一个Mono对象包含0个或1个元素,而一个Flux对象包含1个或多个元素。

一. 什么是RestTemplate

传统情况下在Java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行 *** 作,这就是RestTemplate。

二、举个例子。 //请求地址

String url = "http://localhost:8080/testPost"

//入参

RequestBean requestBean = new RequestBean()

requestBean.setTest1("1")

requestBean.setTest2("2")

requestBean.setTest3("3")

RestTemplate restTemplate = new RestTemplate()

ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class)

从这个例子可以看出,使用restTemplate访问restful接口非常的简单粗暴无脑。(url,

requestMap, ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。

RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。

三.手动指定转换器(HttpMessageConverter)

我们知道,调用reseful接口传递的数据内容是json格式的字符串,返回的响应也是json格式的字符串。然而restTemplate.postForObject方法的请求参数RequestBean和返回参数ResponseBean却都是java类。是RestTemplate通过HttpMessageConverter自动帮我们做了转换的 *** 作。

默认情况下RestTemplate自动帮我们注册了一组HttpMessageConverter用来处理一些不同的contentType的请求。

如StringHttpMessageConverter来处理text/plainMappingJackson2HttpMessageConverter来处理application/jsonMappingJackson2XmlHttpMessageConverter来处理application/xml。

你可以在org.springframework.http.converter包下找到所有spring帮我们实现好的转换器。

如果现有的转换器不能满足你的需求,你还可以实现org.springframework.http.converter.HttpMessageConverter接口自己写一个。

四.设置底层连接方式

要创建一个RestTemplate的实例,您可以简单地调用默认的无参数构造函数。这将使用java.NET包中的标准Java类作为底层实现来创建HTTP请求。

但很多时候我们需要像传统的HttpClient那样设置HTTP请求的一些属性。RestTemplate使用了一种很偷懒的方式实现了这个需求,那就是直接使用一个HttpClient作为底层实现......

五.设置拦截器(ClientHttpRequestInterceptor)

有时候我们需要对请求做一些通用的拦截设置,这就可以使用拦截器进行处理。拦截器需要我们实现org.springframework.http.client.ClientHttpRequestInterceptor接口自己写。

以上是如何使用RestTemplate方便快捷的访问restful接口。其实RestTemplate的功能非常强大


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11313195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存