步骤一 准备两个服务,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'
- consumer的yml
- 此处的yml的其他部分在nacos配置中心中,关于nacos的配置中心如何使用见我的另一篇博客
【SpringCloudAlibaba系列–nacos配置中心】
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的输出,看看是否成功
如图所示,都能访问到就是成功了