Feign學習筆記4-利用Eureka完成多節點同步

利用Eureka完成多節點同步

pom文件

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.12.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>

利用Eureka獲取全部節點

appName表示爲應用在eureka中註冊名稱
在這裏插入圖片描述

	@Autowired
    private EurekaClient eurekaClient;
    @Autowired
    private XxxConverters xxxConverters;

    public void query(String code) {
        List<InstanceInfo> instanceInfos = eurekaClient.getInstancesByVipAddressAndAppName(null, appName, false);
        if (CollectionUtils.isEmpty(instanceInfos)) {
            // throw new Exception();
        }
        for (InstanceInfo instanceInfo : instanceInfos) {
            xxxConverters.queryForUrl(instanceInfo.getHomePageUrl(),code);
        }
        return tasks;
    }

利用Feign輪詢節點

動態生成feign客戶端

@Component
@Import(FeignClientsConfiguration.class)
public class DynamicBuildFeignService {
    @Autowired
    private Decoder decoder;
    @Autowired
    private Encoder encoder;

    public <T> T buildFeignClient(Class<T> feignClass, String url) {
        return Feign.builder().decoder(decoder).encoder(encoder)
            .target(feignClass, url);
    }
}

轉換控制類,主要職責是保存feign的客戶端,不要每次都生成一個。

@Component
public class XxxConverters {
    private Map<String, XxxFeignClient> feignClients = Maps.newHashMapWithExpectedSize(32);
    @Autowired
    private DynamicBuildFeignService dynamicBuildFeignService;

    public XxxFeignClient getFeignClient(String url) {
        XxxClient feignClient = feignClients .get(url);
        if (null == feignClient) {
            feignClient = dynamicBuildFeignService.buildFeignClient(XxxFeignClient.class, url);
            feignClients.put(url, feignClient);
        }
        return feignClient;
    }

    public List<Xxx> queryForUrl(String url, String code) {
        List<Xxx> result = getFeignClient(url).queryForThis(code);
        return result ;
    }
}

Feign客戶端,此處需要注意RequestLine的使用。

@FeignClient(name = "appName")
public interface XxxFeignClient {
    @RequestLine("GET /api/xxx/{code}")
    List<Xxx> queryForThis(@Param("code") String code);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章