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


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

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

相关推荐
子兮曰1 小时前
Bun v1.4.1 深度解析:从 Zig 到 Rust,一场 11 天、64 个 AI 代理的语言迁徙
前端·后端·bun
两点王爷1 小时前
解决 Linux 中 version `CXXABI_1.3.8‘ not found 报错
linux·运维·服务器
0+1111 小时前
Linux --线程概念与控制
linux·运维·服务器·jvm
宽海智能仓储物流2 小时前
航发自动化立体库异构系统改造:宽海智能30天联调技术全解析
运维·数据仓库·自动化
鹤落晴春2 小时前
【K8s】从 ConfigMap 到 Argo CD:Kubernetes 配置管理链路
运维·云原生·容器·kubernetes
2601_949499942 小时前
DT‑1414PTZ如何百分百兼容(安华高)HFBR‑1414PTZ
运维·网络·人工智能·科技·光模块
fengyehongWorld3 小时前
Linux 安装frp实现内网穿透
linux·运维·服务器
IT_陈寒3 小时前
Vue的computed属性竟然坑了我一把
前端·人工智能·后端
一技安身4 小时前
【信创】银河麒麟V10服务器使用安装光盘Packages自建本地yum源
linux·运维·服务器
薛定谔的悦4 小时前
一套储能 BMS 的充电电流限值,是怎么一步步算出来的
后端