昨天完成了服务的注册和发现 今天就该消费服务啦 在微服务架构中业务都是一个个独立的服务 服务和服务之间是通过http restful进行通讯的。首先看一下用ribbon + rest
ribbon是什么呢,大概说就是一个负载均衡的客户端,可以很好的控制一些http 和 tcp 的行为
还是老样子 废话不多说 直接上正路
还是基于昨天创建好的三个工程继续进行学习 先启动好serv和client 如果昨天的顺利进行呢,这时候会有一个服务啦
重点来啦 这时候把client的端口号改为8763 再次启动 注意不是关掉上次的 是再启动一个,如果启动成功 应该是这样的
这时候我们就相当于模拟了一个小集群了呢
服务有了 那么我们可以进行消费了
创建一个新的springboot工程 命名service_ribbon
需要引入web
eureka-starter
ribbon
三个依赖 ,版本问题不再赘述 自己注意即可 (ps:我只是截个图而已 版本不一样大概位置会有一点小区别 不要在意哈)
pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ribbon</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>service_ribbon</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Camden.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
</project>
首先主类需要加注解@EnableDiscoveryClient向服务中心注册
然后向ioc容器注入一个需要用的bean 并且通过@LoadBalanced注解开启负载均衡
就是返回一个RestTemplete对象的方法并加注解@LoadBalanced
好了 准备工作这样就好了 接下来是测试
写一个controller 和service
package com.ribbon.demo.controller;
import com.ribbon.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author chunying
*/
@RestController
public class DemoController {
@Autowired
private DemoService demoService;
@RequestMapping(value = "/hello")
public String fun1(@RequestParam String name) {
return demoService.fun1(name);
}
}
要说一下service
注入我们刚才准备好的RestTemplate
通过getForObject ()方法调用我们向服务中心注册的服务 这里的url要注意
需要用服务的名字代替访问的服务名 方法名参数不变
服务名在这 也就是之前client子工程properties文件中的spring.application.name的值
package com.ribbon.demo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* @author chunying
*/
@Service
public class DemoService {
@Autowired
private RestTemplate restTemplate;
public String fun1(String name) {
return restTemplate.getForObject("http://HELLO/hello?name=" + name , String.class);
}
}
然后启动项目
访问http://localhost:8764/hello?name=ying
多次访问会交替出现两个结果分别是
hello!8763,ying,come here
hello!8762,ying,come here
说明我们已经分别访问到了两个不同的实例,已经是负载均衡调用啦~~
此时我们大概的架构是这样的(ps:不要嘲笑我顶级的画图技术)
好了ribbon 就到这里了 后面会继续学习另一种服务调用方式feign