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


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

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

相关推荐
今夜星辉灿烂几秒前
nestjs微服务-系列2
javascript·后端
世界哪有真情40 分钟前
用虚拟IP扩容端口池:解决高并发WebSocket端口耗尽问题
前端·后端·websocket
好名字更能让你们记住我41 分钟前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos
门思科技42 分钟前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网
知其然亦知其所以然1 小时前
JVM社招面试题:队列和栈是什么?有什么区别?我在面试现场讲了个故事…
java·后端·面试
笑口常开的小丸子1 小时前
Flask YAML管理工具
后端·python·flask
武子康1 小时前
大数据-30 ZooKeeper Java-API 监听节点 创建、删除节点
大数据·后端·zookeeper
知了一笑1 小时前
SpringBoot3集成多款主流大模型
spring boot·后端·openai
wmze1 小时前
InnoDB存储引擎--索引与锁
后端
星辰大海的精灵1 小时前
如何确保全球数据管道中的跨时区数据完整性和一致性
java·后端·架构