这是一个从零开始的springcloud的系列教程,如果你从中间开始看,可能会看不明白.请进入我的系列教程开始从头开始学习.spring-cloud教程
服务发现
在框架中,服务之间的相互调用不再通过传统的ip地址来寻找到对方.而是通过服务名称,然后向服务注册中心获取服务ip地址,然后再进行调用,达到动态化增加服务和自动化发现服务的目的.
传统方式调用:
服务A -> http请求(服务B的ip地址192.168.0.100:8001)->服务B收到
传统方式调用依赖静态配置,服务A有个配置文件,里面配置了服务B的ip地址
治理框架下调用:
服务A -> 向注册中心咨询服务B的地址或从缓存中获取 -> 得到地址后发起http请求(服务B集群状况下,是一组地址,根据轮询策略来决定使用哪个ip地址) -> 服务B收到
在使用服务治理框架来发现服务,使用者不再关心服务B的具体位置,只需要关心我想使用服务名称叫B的服务,哪怕服务B的ip变更也不影响服务A的调用.大大降低了维护成本.
发现服务
之前我们已经掌握了一个微服务如何将自己注册到服务治理中心(eureka-sevrer),将eureka-client2工程进行启动注册,服务名称为eureka-client2,端口为7772
Spring-Cloud通过DiscoveryClient来进行发现服务的操作,修改eureka-client工程的EurekaClientApplication类
package com.jack.eureka_client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@SpringBootApplication
@RestController
//@EnableEurekaClient (Finchley.SR2已经不需要该配置了,你只需要在配置文件中含有eureka.client.enabled的配置即可)
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
private DiscoveryClient discoveryClient;
// 得到DiscoveryClient
@Autowired
public void setDiscoveryClient(DiscoveryClient discoveryClient) {
this.discoveryClient = discoveryClient;
}
@RequestMapping(value = "/discovery", method = RequestMethod.GET)
public Object discovery() {
// 获取服务名称列表
List<String> names = discoveryClient.getServices();
System.out.println("*******************" + names);
StringBuilder builder = new StringBuilder();
for (String name : names) {
// 根据服务名称获取服务实例列表,可能是多个实例.
List<ServiceInstance> instances = discoveryClient.getInstances(name);
for (ServiceInstance instance : instances) {
String info = instance.getServiceId() + "," +
instance.getHost() + "," +
instance.getPort() + "," +
instance.getUri() + "<br/>";
System.out.println(info);
builder.append(info);
}
}
return builder.toString();
}
}
http请求localhost:7771/discovery,得到两个服务实例信息,EUREKA-CLIENT,EUREKA-CLIENT2.
image.png通过服务的详细信息动态的获取服务的ip地址,然后发送http请求.如果一个服务名称有多个实例,需要根据轮询策略来决定请求哪个具体实例,为此需要写代码去做这方面的处理.幸运的是spring-cloud已准备了工具,不需要再进行编写了.
总结
经过上面的讲解,已经了解服务发现的概念,以及如何用代码来发现服务.不过以上还不足以让我们方便的进行服务之间的调用.SpringCloud提供两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。接下来我们会对两种方法进行深入的讲解.
网友评论