我们现在已经对服务注册中心有了认识,同时还将已有的springBoot项目注册到了Eureka注册中心上,成为该服务治理体系的一个服务。所以我们现在有了服务注册中心和服务提供者,下面我门再来构建一个服务消费者,它主要完成两个目标,发现服务以及消费服务。其中服务发现有Eureka客户端完成,而服务消费的任务由Ribbon完成。Ribbon我们在后面对其介绍,目前只需要理解它在Eureka服务发现的基础上,实现了一套对服务实例的选择策略,从而实现对服务的消费。
实现服务发现与消费
启动服务提供者
首先我们命令通过不同的端口号启动之前的服务提供者
java -jar AirTicket-1.0.jar --server.port=8081
java -jar AirTicket-1.0.jar --server.port=8000
此时我们可以通过查看服务注册中心看到两个端口的服务已经注册成功了。
创建消费者
创建一个SPring Boot的基础工程来实现服务消费者,取名为ribbon-consumer,并向pom文件中引入以下依赖。这里我用的依赖比较低,是为了测试兼容性。
pom.xml
其中最主要就是spring-cloud-starter-netflix-ribbon。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<!--<version>1.4.0.RELEASE</version>-->
<!--这个版本因为网络问题不写有时候会报错,写上也没有问题-->
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
创建应用主类Application
这里通过@EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获取服务发现的能力,同时在主类中创建RestTemplate的Spring bean实例,并通过@LoadBalanced注解开启客户端的负载均衡。
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
创建ConsumerController接口
这里的URL是服务提供者(端口为8000以及8081)的spring.application.name。去配置文件中看。这个地址如果不对,会报错。
restTemplate.getForEntity(“http://eureka-client-consumer/hello“,String.class).getBody();
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
public String helloConsumer(){
return restTemplate.getForEntity("http://eureka-client-consumer/hello",String.class).getBody();
}
}
此时我们已经完成了一个服务发现与消费,此时访问http://localhost:9000/ribbon-consumer,在消费者的控制台中可以看到以下信息。此时可以看到Ribbon输出了当前客户端维护的服务提供者的服务列表情况。其中包含了各个实例的位置,Ribbon就是按照此信息进行轮训访问,以实现基于客户短的负载均衡。另外还输出了一些其他非常有用的信息,如对各个实例的请求总数量、第一次链接信息、上一次链接信息、总的请求失败数量等等。。。
DynamicServerListLoadBalancer for client eureka-client-consumer initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=eureka-client-consumer,current list of
Servers=[192.168.150.254:8000, 192.168.150.254:8081],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:2; Active connections count: 0;Circuit breaker tripped count: 0; Active connections per server: 0.0;]},Server stats: [[Server:192.168.150.254:8081; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970;Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0],
此时我们如果多次发送请求,并观察启动的两个服务提供者(端口为8000和8081)的控制台,可以看到两个控制台会交替打印下面的日志:
: hello,host:192.168.XXX.XXX service_id:EUREKA-CLIENT-CONSUMER
这是我们之前在HelloController中实现的对服务信息的输出,可以用来判断消费者对服务提供者的调用是否是负载均衡的。