SpringCloud学习笔记(二)ribbon————服务消费者
昨天完成了服务的注册和发现 今天就该消费服务啦 在微服务架构中业务都是一个个独立的服务 服务和服务之间是通过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