【SpringCloudAlibaba系列--OpenFeign组件】OpenFeign的配置、使用与测试以及OpenFeign的负载均衡

步骤一 准备两个服务,provider和consumer

本文使用kotlin语言

provider是服务的提供者,由provider连接数据库

kotlin 复制代码
@RestController
@RequiredArgsConstructor
@RequestMapping("/provider/depart")
class DepartController(
    private val departService: DepartService, 
    private val discoveryClient: DiscoveryClient,
    private val environment: Environment
    @GetMapping("/list")
    fun listHandle(): MutableList<Depart> {
        val port = environment.getProperty("local.server.port")
        println("当前服务运行在端口: $port")
        return departService.findAllDeparts()
    }
   }

consumer是服务的消费者,consumer会去调用provider提供的服务

  • consumer需要添加loadbalancer
groovy 复制代码
    // FeignBlockingLoadBalancerClient
    implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer:4.0.4'
yml 复制代码
spring:
  application:
    name: equipment-management-feign
  cloud:
    nacos:
      config:
        username: your_usr_name
        password: your_pss
        server-addr: xxx.xxx.xx.xx:8848
        file-extension: yml
        group: HardwareServices 
        namespace: e8c3bd64-52ff-494e-a51f-a907d9f098b8
    openfeign:
      client:
        config:
          default:
            connect-timeout: 500 #设置超时时间
            read-timeout: 500
      compression:
        request:
          enabled: true #开启压缩
          mime-types: ["text/xml", "application/xml", "application/json","video/mp4"]
          min-request-size: 1024 #超过此数值进行压缩
        response:
          enabled: true
      httpclient:
        hc5:
          enabled: true #使用hc5,默认是hc4,也可以选择OkHttp

  config:
    import:
      - optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
  • EquipmentConfig
  • 从所有provider实例中,根据 n a m e 获取所有的可用实例,再根据 name获取所有的可用实例,再根据 name获取所有的可用实例,再根据name随机选择一个
kotlin 复制代码
// 负载均衡
class EquipmentConfig {
    @Bean
     fun randomLoadBalancer(e:Environment,factory:LoadBalancerClientFactory):ReactorLoadBalancer<ServiceInstance>{
         //获取微服务名称
        var name: String? = e.getProperty(LoadBalancerClientFactory.PROPERTY_NAME)
        // 从所有provider实例中,根据$name获取所有的可用实例,再根据$name随机选择一个
        return RandomLoadBalancer(factory.getLazyProvider(name, ServiceInstanceListSupplier::class.java),name)
    }

}
  • DpartController
kotlin 复制代码
@RestController
@RequestMapping("/consumer/depart")
@RequiredArgsConstructor
class DepartController(private val departService: DepartService) {
    //查全部
    @GetMapping("/list")
    fun listHandle():List<Depart>?=departService.listAllDeparts()
}
  • DepartService
  • 此处注意,下面接口中的@FeignClient("depart-provider", path = "/provider/depart")这种写法是新版openfeign的唯一方式,老版可以把path中的内容写在前面
kotlin 复制代码
@FeignClient("depart-provider", path = "/provider/depart") // 新版唯一方式
interface DepartService {
    //查全部
    @GetMapping("/list")
    fun listAllDeparts():List<Depart>?
}
  • 启动类
  • 在启动类上加上这句:@LoadBalancerClients(defaultConfiguration = [EquipmentConfig::class])
kotlin 复制代码
@LoadBalancerClients(defaultConfiguration = [EquipmentConfig::class])
@SpringBootApplication
@EnableFeignClients
class EquipmentManagement8012Application

fun main(args: Array<String>) {
    runApplication<EquipmentManagement8012Application>(*args)
}

启动多个provider

  • 按照截图中的内容操作
  • 勾选Allow multiple instances
  • 点击Copy Configuration
  • 注意多实例运行同一个微服务时,多个微服务不能使用同一个接口,在-Dserver.port=xxxx处指定你的接口

    启动多个实例后,多次访问consumer的接口,然后查看你启动的多个provider的输出,看看是否成功


    如图所示,都能访问到就是成功了

有任何问题想要探讨可以私信我

相关推荐
番茄Salad16 分钟前
Spring Boot项目中Maven引入依赖常见报错问题解决
spring boot·后端·maven
还不秃顶的计科生27 分钟前
linux下conda未安装的解决方法(离线安装linux下的conda)
linux·运维·服务器
CryptoRzz1 小时前
越南k线历史数据、IPO新股股票数据接口文档
java·数据库·后端·python·区块链
QX_hao1 小时前
【Go】--数组和切片
后端·golang·restful
-睡到自然醒~1 小时前
提升应用性能:Go中的同步与异步处理
开发语言·后端·golang
爱学习饼1 小时前
CentOS下安装配置JDK24和tomcat11
linux·运维·centos
文心快码BaiduComate1 小时前
新手该如何选择AI编程工具?文心快码Comate全方位体验
前端·后端·程序员
Super Rookie1 小时前
Tomcat 自动化脚本安装方案
运维·tomcat·自动化
qinxue7221 小时前
Jenkins自动化配置--CICD流水线
运维·自动化·jenkins
阿挥的编程日记2 小时前
基于SpringBoot的影评管理系统
java·spring boot·后端