【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的输出,看看是否成功


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

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

相关推荐
Selegant几秒前
Spring Boot 3 + Java 21 全新特性实战:虚拟线程、结构化并发与 Record 类型
java·spring boot·后端
何中应4 分钟前
【面试题-6】MySQL
数据库·后端·mysql·面试题
woniu_maggie14 分钟前
SAP冲销凭证功能
后端
一念之间lq15 分钟前
Elpis 第三阶段· 领域模型架构建设
前端·后端
wanhengidc18 分钟前
云手机存在哪些技术瓶颈
运维·服务器·安全·智能手机·生活
管理大亨21 分钟前
ELK + Redis Docker 企业级部署落地方案
大数据·运维·elk·elasticsearch·docker·jenkins
+VX:Fegn089527 分钟前
计算机毕业设计|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计·旅游
码界奇点33 分钟前
基于SpringBoot和Vue的Fuint门店会员营销系统设计与实现
vue.js·spring boot·后端·毕业设计·springboot·源代码管理
德迅云安全—珍珍34 分钟前
物理服务器、云服务器、裸金属服务器的区别
运维·服务器
好记忆不如烂笔头abc1 小时前
超微服务器的ipmi调整风扇运行模式
运维·服务器