利用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);
}