步骤一 准备两个服务,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
// FeignBlockingLoadBalancerClientimplementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer:4.0.4'
- consumer的yml
- 此处的yml的其他部分在nacos配置中心中,关于nacos的配置中心如何使用见我的另一篇博客
【SpringCloudAlibaba系列–nacos配置中心】
spring:application:name: equipment-management-feigncloud:nacos:config:username: your_usr_namepassword: your_pssserver-addr: xxx.xxx.xx.xx:8848file-extension: ymlgroup: HardwareServices namespace: e8c3bd64-52ff-494e-a51f-a907d9f098b8openfeign:client:config:default:connect-timeout: 500 #设置超时时间read-timeout: 500compression:request:enabled: true #开启压缩mime-types: ["text/xml", "application/xml", "application/json","video/mp4"]min-request-size: 1024 #超过此数值进行压缩response:enabled: truehttpclient:hc5:enabled: true #使用hc5,默认是hc4,也可以选择OkHttpconfig:import:- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
- EquipmentConfig
- 从所有provider实例中,根据 n a m e 获取所有的可用实例,再根据 name获取所有的可用实例,再根据 name获取所有的可用实例,再根据name随机选择一个
// 负载均衡
class EquipmentConfig {@Beanfun 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 EquipmentManagement8012Applicationfun main(args: Array<String>) {runApplication<EquipmentManagement8012Application>(*args)
}
启动多个provider
- 按照截图中的内容操作
- 勾选Allow multiple instances
- 点击Copy Configuration
- 注意多实例运行同一个微服务时,多个微服务不能使用同一个接口,在-Dserver.port=xxxx处指定你的接口
启动多个实例后,多次访问consumer的接口,然后查看你启动的多个provider的输出,看看是否成功
如图所示,都能访问到就是成功了