微服务负载均衡实践

这篇具有很好参考价值的文章主要介绍了微服务负载均衡实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

概述

环境说明

步骤

改造Eureka为单节点

spring-cloud-loadbalancer

服务调用

负载均衡

OpenFeign

OpenFeign的使用

OpenFeign的配置

总结


 

概述

本文介绍微服务的服务调用和负载均衡,使用spring cloud的loadbalancer及openfeign两种技术来实现。

本文的操作是在微服务的初步使用的基础上进行。

环境说明

jdk1.8

maven3.6.3

mysql8

spring cloud2021.0.8

spring boot2.7.12

idea2022

步骤

改造Eureka为单节点

为了方便测试,把高可用Eureka还原为单节点Eureka。

修改eureka_server的application.yml

spring:
  application:
    name: eureka-server
server:
  port: 9000
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 4000

修改product-service服务和order-service服务的application.yml的Eureka配置如下

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/

spring-cloud-loadbalancer

spring-cloud-loadbalancer和ribbon类似,之前的spring cloud版本eureka内部继承了ribbon ,但spring cloud版本升级后,不再内置ribbon(可查看依赖关系),spring cloud提供了自己的负载均衡的实现,可查看 官方文档

Spring Cloud provides its own client-side load-balancer abstraction and implementation. For the load-balancing mechanism, ReactiveLoadBalancer interface has been added and a Round-Robin-based and Random implementations have been provided for it. In order to get instances to select from reactive ServiceInstanceListSupplier is used. Currently we support a service-discovery-based implementation of ServiceInstanceListSupplier that retrieves available instances from Service Discovery using a Discovery Client available in the classpath.

服务调用

之前服务调用时,使用host:ip拼接成URL的方式进行调用,较为麻烦,使用@LoadBalanced注解后,可以使用微服务的服务名称来进行调用,更加方便。

在创建RestTemplate的时候,申明@LoadBalanced

使用restTemplate调用远程微服务:不需要拼接微服务的URL,用服务名称替换IP地址

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

修改OrderController.java,使用服务名称代替host:port的形式,避免了之前的使用实例元数据进行拼接。

修改前

product  = restTemplate.getForObject("http://"+host+":"+port+"/product/1", Product.class);

修改后

product  = restTemplate.getForObject("http://service-product/product/1", Product.class);

启动测试

启动eureka、product、order服务

浏览器访问

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

能访问到数据,说明服务调用成功了。

负载均衡

使用@LoadBalanced注解后,除了方便使用服务名称进行调用之外,更重要的是也实现了服务调用的负载均衡功能。准备两个商品服务,端口号分别为9001、9011,两个商品服务的作用:1.增加系统吞吐率  2.商品服务高可用。

服务架构及流程如下图:

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

修改product-service的controller

    @Value("${spring.cloud.client.ip-address}") //springcloud自动获取应用的ip地址
    private String ip;

启动product服务(9001端口)

修改product服务的yml,修改服务端口为9011

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

复制运行配置得到另一个proudct服务

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

启动product2服务(9011端口)

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

查看Eureka Web页面

http://localhost:9000/

看到SERVICE-PRODUCT,有2个在线状态的实例,端口分别是:9001和9011 

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

启动order服务

分别访问9001和9011

http://localhost:9001/product/1

http://localhost:9011/product/1

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

两个商品服务均正常

测试负载均衡

访问如下链接2次

http://localhost:9002/order/buy/1

发现实现 第一次访问9001商品服务,第二次访问了9011商品服务,说明实现了客户端的负载均衡

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

多次刷新访问http://localhost:9002/order/buy/1,发现9001和9011是交替出现,说明默认使用的负载均衡是轮询策略。

OpenFeign

此前的服务调用代码如下:

restTemplate.getForObject("http://service-product/product/1", Product.class);

如果请求参数过多是,拼接URL的方式显得麻烦,可以使用OpenFeign来解决。

OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。

OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持。

OpenFeign的使用

order-service操作

1.导入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.配置调用接口

业务需求:order服务调用product服务

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

@FeignClient(name = "service-product")
public interface ProductFeignClient {

    /**
     * 配置需要调用的微服务接口
     * @return
     */
    @RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
    Product findById(@PathVariable("id") Long id);
}

 3.在启动类上激活feign

//激活feign
@EnableFeignClients
public class OrderApplication {

4.通过自动注入的接口调用远程微服务

修改之前的Controller代码

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable Long id){
        Product product = null;

        product  = restTemplate.getForObject("http://service-product/product/1", Product.class);

        return product;
    }

}

修改之后的代码

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private ProductFeignClient productFeignClient;

    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable Long id){
        Product product = null;

        //调用微服务
        product = productFeignClient.findById(id);

        return product;
    }

}

可以看出,OrderController通过注入ProductFeignClient接口实例,并调用接口方法实现了调用。 可以看出不需要自己构建http请求,就像是调用自身工程的方法调用。如果有多个参数可以传递对象参数,避免了拼接url的麻烦。

测试

启动服务

启动eureka、启动product(启动两个实例:9000和9011)、启动order

浏览器访问

分别访问,确保product服务能正常访问

http://localhost:9001/product/1

http://localhost:9011/product/1

访问order两次

http://localhost:9002/order/buy/1

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

微服务负载均衡实践,微服务,IDEA,jdk,微服务,负载均衡,架构

多次访问,发现9001和9011交替出现,说明实现了负载均衡。

OpenFeign的配置

如果需要配置OpenFeign,在application.yml添加相关配置

配置案例如下:

feign:
  client:
    config:
      feignName: #FeginClient的名称
        connectTimeout: 5000 #建立链接的超时时长
        readTimeout: 5000 #读取超时时长
        loggerLevel: full #Fegin的日志级别
        errorDecoder: com.example.SimpleErrorDecoder #Feign的错误解码器
        retryer: com.example.SimpleRetryer #配置重试
        requestInterceptors: #添加请求拦截器
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        decode404: false #配置熔断不处理404异常
      #日志配置  
      #NONE : 不输出日志(高)   
      #BASIC: 适用于生产环境追踪问题
      #HEADERS : 在BASIC的基础上,记录请求和响应头信息   
      #FULL : 记录所有
      service-product:
        logger-level: FULL #配置商品服务日志
  compression:
    request:
      enabled: true #开启请求压缩
      mime-types: text/html,application/xml,application/json #设置压缩的数据类型
      min-request-size: 2048 #设置触发压缩的大小下限
    response:
      enabled: true #开启相应压缩
logging:
  level:
    org.example.order.feign.ProductFeignClient: debug #配置具体接口的日志级别

总结

两种服务调用及负载均衡技术:@LoadBalanced方式和OpenFeign的方式。

1.@LoadBalanced方式是借助于RestTemplate方式进行,可以直接使用服务名称来调用,但需要拼接URL。

2.OpenFeign的方式是通过声明接口并注入接口进行调用,避免了拼接URL的麻烦。

完成!enjoy it!文章来源地址https://www.toymoban.com/news/detail-728842.html

到了这里,关于微服务负载均衡实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • lvs DR模式+基于五台服务器部署keepalived + lvs DR模式架构(前端带路由)负载均衡的高可用集群

    lvs DR 模式+基于五台服务器部署keepalived + lvs DR模式架构(前端带路由)负载均衡的高可用集群 DR 模式一: 客户端:172.20.26.167 LVS服务器:172.20.26.198 后端服务器:172.20.26.218 后端服务器:172.20.26.210 两台后端服务器 yum install nginx tcpdump -y echo \\\"this is 26.218 page\\\" /usr/share/nginx/html/index

    2024年02月19日
    浏览(48)
  • 阿里云负载均衡SLB网络型NLB负载均衡架构性能详解

    阿里云网络型负载均衡NLB是阿里云推出的新一代四层负载均衡,支持超高性能和自动弹性能力,单实例可以达到1亿并发连接,帮您轻松应对高并发业务。网络型负载均衡NLB具有超强性能、自动弹性伸缩、高可用、TCPSSL卸载、多场景流量分发和丰富的高级特性。网络型负载均衡

    2024年02月14日
    浏览(48)
  • HAProxy负载均衡架构

    (1)HAProxy 是一款 提供高可用性、负载均衡 以及 基于TCP(第四层)和HTTP(第七层)应用 的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别 适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理 。HAProxy运行在时下的硬件上

    2024年02月01日
    浏览(46)
  • 架构篇20:高性能负载均衡-分类及架构

    单服务器无论如何优化,无论采用多好的硬件,总会有一个性能天花板,当单服务器的性能无法满足业务需求时,就需要设计高性能集群来提升系统整体的处理性能。 高性能集群的本质很简单,通过增加更多的服务器来提升系统整体的计算能力。由于计算本身存在一个特点:

    2024年01月25日
    浏览(46)
  • Nginx反向代理-负载均衡、webshell实践

    目录 1.nginx反向代理-负载均衡 1)搭建web项目 2)修改 nginx.conf的配置 2.webshell 实践 1)异或操作绕过 2)取反绕过  3)php语法绕过  1.nginx反向代理-负载均衡 1)搭建web项目 首先通过 SpringBoot+Freemarker 快速搭建一个 WEB 项目:springboot-web-nginx然后在该项目中,创建一个 IndexNgin

    2024年02月12日
    浏览(46)
  • LNMT架构之反向代理负载均衡

    目录 一、实验前提环境配置 (一)关闭防火墙,安装本地yum (二)部署tomcat (三)部署Mariadb (四)部署nginx 二、反向代理负载均衡 方法一:(轮询)默认 方法二:(加权轮询) systemctl stop firewalld iptables -F setenforce 0 1、 单机部署 步骤一: 安装两个tomcat tar -xzf apache_tomc

    2024年02月07日
    浏览(38)
  • webshell实践,在nginx上实现负载均衡

    我采用了三台虚拟机进行服务器设置:192.168.240.11、192.168.240.12、192.168.240.13           

    2024年02月12日
    浏览(36)
  • 架构篇21:高性能负载均衡-算法

    负载均衡算法数量较多,而且可以根据一些业务特性进行定制开发,抛开细节上的差异,根据算法期望达到的目的,大体上可以分为下面几类。 任务平分类:负载均衡系统将收到的任务平均分配给服务器进行处理,这里的“平均”可以是绝对数量的平均,也可以是比例或者权

    2024年01月25日
    浏览(52)
  • 搭建TiDB负载均衡环境-HAproxy+KeepAlived实践

    作者: 我是咖啡哥 原文来源: https://tidb.net/blog/8e8cca1d HAProxy 提供 TCP 协议下的负载均衡能力,TiDB 客户端通过连接 HAProxy 提供的浮动 IP 即可对数据进行操作,实现 TiDB Server 层的负载均衡。同时,HAproxy部署2个节点,使用KeepAlived来实现高可用。 TiDB版本:V7.1.0 haproxy版本:2.

    2024年02月09日
    浏览(36)
  • LVS+Keepalived架构(负载均衡高可用集群)

    普通的群集的部署是通过 一台调度器控制调配多台节点服务器 进行业务请求的处理,但是仅仅是一台调度器,就会存在极大的单点故障风险,当该调度器的链路或则调度器本身出现故障时,就会导致整个业务的无法正常进行  而高可用集群是由 一台主调度器和一台或多台备

    2024年02月12日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包