SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong
通过消费者的方式来进行消费服务,而不是通过像上一篇,那种方式,比较的菜,而且如果使用那种方式,还不如直接弄传统的方式来开发,没必要引入Springcloud的框架了,对于SpringCloud的服务消费方式有两种:1、通过rest+ribbon的方式,2,通过Feign的方式。我们先介绍通过ribbon 的方式。实现通过Ribbon消费服务,主要有三个步骤:1、配置pom.xml,加入依赖,2、配置application.yml,设定服务,3、配置启动类,添加RestTemplate,4、配置Service层,添加服务,5、配置Controller层,暴漏服务。最后测试的时候,一定要注意,先看Eureka的管控台,看服务是否都启动完了。
代码地址
https://gitee.com/yellowcong/springcloud/tree/master/chapter2
目录结构
在这次的演示代码中, 我配置了两个服务提供
服务架构
节点 | 服务 | 项目名 |
---|---|---|
yellowcong.com:8761 | eureka注册服务 | eureka-server |
yellowcong.com:8762 | 提供服务1 | eureka-client |
yellowcong.com:8763 | 提供服务2 | eureka-client2 |
yellowcong.com:8764 | ribbon服务 | ribbon-server |
Riboon 服务搭建
实现通过Ribbon消费服务,主要有三个步骤:1、配置pom.xml,加入依赖,2、配置application.yml,设定服务,3、配置启动类,添加RestTemplate,4、配置Service层,添加服务,5、配置Controller层,暴漏服务。
1、配置pom.xml
配置riboon服务,需要导入spring-cloud-starter-eureka-server
、spring-cloud-starter-ribbon
这两个关键的依赖。
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
下面是完整的pom.xml 配置文件
<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>yellowcong.com</groupId>
<artifactId>cas-client-springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>cas-client-springboot</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- 引用父类依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 添加spring的插件, 就可以直接通过 mvn spring-boot:run 运行了 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
2、配置application.yml
在riboon的配置中,需要设置eureka的中心,向注册中心注册自己的服务。
#配置eureka 的注册中心
eureka:
client:
serviceUrl:
defaultZone: http://yellowcong.com:8761/eureka/
# 注册服务的端口
server:
port: 8764
#配置当前服务的名称
spring:
application:
name: service-ribbon
3、配置启动类
我们在配置RestTemplate
的时候,添加了@LoadBalanced
注解,表示这个服务是负载均衡的。当访问服务的时候,会自动进行负载均衡的操作。
package com.yellowcong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class ConfigMain {
public static void main(String[] args) {
SpringApplication.run(ConfigMain.class, args);
}
/**
* 创建日期:2018年3月16日<br/>
* 创建用户:yellowcong<br/>
* 功能描述:设定负载均衡策略
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
4、配置Service
通过RestTemplate
的getForObject方法来执行存在于Eureka的服务。同时还需要注意的一点是,我们没有写具体的服务地址,而是写的是在Eureka中注册的服务名称,ribbon会为我们替换成实例所指向的地址。
package com.yellowcong.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* 创建日期:2018年3月16日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:
*/
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
/**
* 创建日期:2018年3月16日<br/>
* 创建用户:yellowcong<br/>
* 功能描述:通过rest的方式来调用模板
* @param name
* @return
*/
public String sayHi(String name) {
//可以看到执行的路径直接是SERVICE-HI ,在ribbon中,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
return restTemplate.getForObject("http://SERVICE-HI/hi/" + name, String.class);
}
}
5、配置Controller
Controller的作用,就是将service配置的服务暴漏出去,我们只需要同被请求的服务的访问的方式一致即可,再说,我们可以直接通过ribbon来访问提供的服务,我们可以自定义这些服务的名称,不一定非要和被调用的服务名 一毛一样。
package com.yellowcong.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.yellowcong.service.HelloService;
/**
* 创建日期:2018年3月16日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:将提供的服务,用ribbon封装一层
*/
@RestController
public class HelloController {
@Autowired
HelloService helloService;
/**
* 创建日期:2018年3月16日<br/>
* 创建用户:yellowcong<br/>
* 功能描述:直接访问riboon的服务地址 /hi
* @param name
* @return
*/
@RequestMapping(value = "/hi/{name}")
public String hi(@PathVariable String name) {
return helloService.sayHi(name);
}
}
6、运行测试
启动的顺序如下,必须先把注册服务端搞起来,不然谁也别想玩了。
项目名 | 启动顺序 |
---|---|
eureka-server | 1 |
eureka-client | 2 |
eureka-client2 | 3 |
ribbon-server | 4 |
访问riboon站点 http://yellowcong.com:8764/hi/xxx,可以看到处理请求的服务器是变化的,说明负载均衡生效了。
访问ribbon前,一定要先看服务两个服务是否都启动,不然死活都访问不到服务的。
常见问题
Maven包导入问题
可以看到,我这个包,又是导入不进来,所以挺烦人的,解决办法,就是加入一个版本号即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>
参考文章
下一篇: OpenCV 图像绘制的实现