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

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

本文使用kotlin语言

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

@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
    // FeignBlockingLoadBalancerClient
    implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer:4.0.4'

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随机选择一个
// 负载均衡
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
@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中的内容写在前面
@FeignClient("depart-provider", path = "/provider/depart") // 新版唯一方式
interface DepartService {
    //查全部
    @GetMapping("/list")
    fun listAllDeparts():List<Depart>?
}
  • 启动类
  • 在启动类上加上这句:@LoadBalancerClients(defaultConfiguration = [EquipmentConfig::class])
@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的输出,看看是否成功
    在这里插入图片描述
    在这里插入图片描述
    如图所示,都能访问到就是成功了

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

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值