前言
极简SpringCloud全家桶之IDEA搭建Eureka集群
上篇文章中,我们讲了搭建Eureka集群。下面我们学习服务提供者和消费者的时候,就直接启动一个Eureka来做演示。
创建一个单实例Eureka的配置文件
application-single.yml
server:
port: 7901
eureka:
instance:
hostname: eureka-7901
client:
service-url:
defaultZone: http://eureka-7901:7901/eureka/
指定服务启动时的配置文件
application.yml
spring:
application:
name: eureka
profiles:
active: single
Provider
新建一个服务提供者 Provider
修改provider的配置文件
设置 provider 端口为 8080
eureka:
client:
service-url:
defaultZone: http://eureka-7901:7901/eureka/
server:
port: 8080
spring:
application:
name: provider
Consumer
创建一个Controller
package com.example.provider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MainController {
@GetMapping("/hi")
public String getHi(){
return "hi";
}
}
启动!
打开 http://localhost:7901/ 可以看到 provider 已经注册到 Eureka 上了
打开浏览器测试一下
http://localhost:8080/hi
浏览器返回 hi
成功!
下面创建一个 Consumer
跟创建 Provider 过程一个,生成项目以后修改下配置文件
application.yml
eureka:
client:
service-url:
defaultZone: http://eureka-7901:7901/eureka/
server:
port: 8081
spring:
application:
name: consumer
创建一个 Controller 以便后续测试之用
package com.example.consumer;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class MainController {
@Autowired
DiscoveryClient dc;
@Qualifier("eurekaClient")
@Autowired
private EurekaClient ec;
@Autowired
LoadBalancerClient lb;
//以下方法且为测试代码,都可以删掉
@GetMapping("/client")
public String client() {
List<String> services = dc.getServices();
for (String str :
services) {
System.out.println("str = " + str);
}
return "hi";
}
@GetMapping("/client2")
public Object client2() {
return dc.getInstances("provider");
}
@GetMapping("/client3")
public Object client3() {
List<ServiceInstance> instances = dc.getInstances("provider");
for (ServiceInstance s :
instances) {
System.out.println(ToStringBuilder.reflectionToString(s));
}
return "success";
}
@GetMapping("/client4")
public Object client4() {
//根据 <instanceId>192.168.0.164:provider:8080</instanceId> 找到具体服务
//List<InstanceInfo> instances = ec.getInstancesById("192.168.0.164:provider:8080");
//使用服务名,找到服务列表
List<InstanceInfo> instances = ec.getInstancesByVipAddress("provider", false);
for (InstanceInfo ins : instances) {
System.out.println(ToStringBuilder.reflectionToString(ins));
}
if (instances.size() > 0) {
//取第一个服务
InstanceInfo instanceInfo = instances.get(0);
if (instanceInfo.getStatus() == InstanceInfo.InstanceStatus.UP) {
String url = "http://" + instanceInfo.getHostName() + ":" + instanceInfo.getPort() + "/hi";
System.out.println("url = " + url);
RestTemplate restTemplate = new RestTemplate();
String forObject = restTemplate.getForObject(url, String.class);
System.out.println("forObject = " + forObject);
}
}
return "1";
}
@GetMapping("/client5")
public Object client5() {
//ribbon 完成客户端负载均衡,并过滤掉 DOWN 了的节点
ServiceInstance instance = lb.choose("provider");
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/hi";
System.out.println("url = " + url);
RestTemplate restTemplate = new RestTemplate();
String forObject = restTemplate.getForObject(url, String.class);
System.out.println("forObject = " + forObject);
return forObject;
}
}
启动 Consumer
启动成功!
可以看到 Provide 和 Consumer 都注册到Eureka上了
下面我们在浏览器输入
假设我们有多个 provider 的话,基本就达成下面这种状态了。
并且我们在 Consumer 的代码中 /client5 中使用了客户端负载均衡Ribbon
参考资料
https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
在我们项目中,可以使用
http://localhost:7901/eureka/apps
来查看 eureka 上注册的所有实例的信息
官网地址里的 v2 不知道干嘛用的,带上就出不来,去掉就正常了
代码仓库
GitHub:https://github.com/xiuqiang1995/Spring-Cloud