SpringCloud的服务调用方式
1.基于ribbon-restTemplate的调用方式
ribbon是一个很好的负载均衡客户端,可以很好的控制http和tcp的行为
他也是我们今天要使用的服务调用方式。
2.基于Feign的服务调用方式
feign默认集成了ribbon
基于上一篇搭建好的基于Eureka注册中心的小项目继续进行消费者和生产者的调用搭建
我们新建一个springboot项目作为我们的负载均衡客户端向注册中心注册。
创建出来的pom文件如下
<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>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>com.springcloud.example</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>eurekaRibbon</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
<dependencies>
<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>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
接下来是我们的application.yml的配置,我们向注册中心注册客户端的基本操作
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8764
spring:
application:
name: service-ribbon
下一步我们开始编写我们的springboot启动类
包结构如下,启动类没有配置从哪里扫描的话,默认从自己的子目录下扫描,所以我放在最顶级包
启动类如下
@SpringBootApplication
//标识我们为可发现的客户端
@EnableDiscoveryClient
public class EurekaRibbonApplication {
public static void main(String[] args) {
//启动类启动我们该项目,加载application.yml配置文件
SpringApplication.run(EurekaRibbonApplication.class, args);
}
//配置bean
@Bean
//开启负载均衡
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
controller层
/**
* @author zzy65
* 消费者的controller
*/
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@RequestMapping("/hello")
public String sayHello(@RequestParam String name){
return helloService.sayHello(name);
}
}
service层 接口就不贴出来了
@Service
public class HelloServiceImpl implements HelloService {
@Autowired
private RestTemplate restTemplate;
public String sayHello(String name) {
//调用生产者的服务返回信息
return restTemplate.getForObject("http://SERVICE-SAYHI/hi?name="+name, String.class);
}
}
接下来我们启动项目,先启动昨日的注册中心。
启动了一个注册中心,两个生产者的实例
然后我们启动我们的ribbon开启负载均衡
这里如果按照我的pom文件的话,应该会报错,加一个jackson的包就好了,因为用了restController注解,是默认的使用了jackson包的。
这里由于我的误操作,ribbon第一次启动没有成功,进入了保护模式,上一篇文章有解决方案。
总之到了最后我们终于成功启动了,接下来访问下试试。
连续访问了两次,是两个不同的端口号,证明负载均衡是成功了,而我连续的访问多几次发现是端口交替出现的,我猜测负载均衡的默认策略是轮询。
以下是现在整个项目的架构图。
今天学会了markdown插入代码和一些命令,很开心。另外送自己一句话,一直警示自己吧。
大多数人25岁就已经死了,75岁才埋葬。