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

猜你喜欢

转载自blog.csdn.net/java_ying/article/details/79866776
今日推荐