Categories
java

DiscoverClient ribbon Feign 服务发现与调用

服务发现是 服务治理的一个很重要的点

所有注册在服务平台的微服务 必须要能被发现 然后调用

而我们调用其他服务一般有三种方法

DiscoverClient ribbon Feign

DiscoverClient 是更加低层的方法 当DiscoverClient 需要寻找服务时 其实是向服务注册器(例如 eureka) 发送 http 请求获取躯体服务信息 包括 ip port 等

@SpringBootApplication
@EnableDiscoveryClient
class Application {

    @Autowired
    DiscoveryClient discoveryClient
}

添加了注解@EnableDiscoveryClient

然后就能自动 注入 discoverClient

 @Autowired
 DiscoveryClient discoveryClient


 def restTemplate = new RestTemplate()
 def serverList = discoveryClient.getInstances("ROBIN-ADMIN")
 println(serverList)
        restTemplate.getForObject("${serverList[0].getUri()}/api/ribbon",Map.class)

获取到discoverClient 就能通过 服务名字 查找服务实例 并且通过RestTemplate 调用服务接口了

Ribbon是调用了 discoverClient 调用服务的 但是他提供了 负载均衡功能,不显式调用某个服务实例 而是通过策略调用某类服务的其中一个 达到负载均衡效果


@SpringBootApplication
class RibbonApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate()
    }
}

在注册RestTemplate对象时 添加LoadBalanced 注解

LoadBalanced 会自动实例化restTemplate 的服务均衡策略 具体查看LoadBalance接口 会定时ping各个服务实例 也会用譬如 回环轮询策略 寻找服务实例

当restTemplate 调用服务时 通过策略调用服务实例

restTemplate.getForObject("http://ROBIN-ADMIN/api/health",Map.class)

ROBIN-ADMIN 为某类服务的服务ID

Feign 是更加接近业务的服务调用方式

maven 添加依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

添加Feign注解

@EnableFeignClients
class RibbonApplication {

}

新建接口对象

package org.robin.ribbon.feign

import org.springframework.cloud.openfeign.FeignClient
import org.springframework.web.bind.annotation.RequestMapping

@FeignClient("ROBIN-ADMIN")
interface RobinAdminService {

    @RequestMapping("/api/ribbon")
    Map ribbon()


    @RequestMapping("/api/health")
    Map health()

}

spring会自动生成 RobinAdminService

调用该对象的方法 可以 调用对应微服务的接口

Leave a Reply