前言
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 spring- cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign。
本文是基于 Ribbon+RestTemplate
开始前首先解释下什么是ribbon、RestTemplate
Ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等等。
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率
一、新建三个工程
1、建立 eureka-server 工程, 这个工程用于服务注册用,
工程结构
配制文件application.yml
server:
port: 8000
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2、建立服务生产者,用于提供服务
工程结构
生产者的controller
@RestController
public class ServiceController {
@Value("${server.port}")
String port;
@RequestMapping("/service/hi")
public String home(@RequestParam String name)
{
return "hi " + name + ",i am from port:" + port;
}
}
配制文件application.yml
server:
port: 8003
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
spring:
application:
name: product-service
3、建立服务消费者工程
工程结构
service服务
package com.test.consumer.server;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
/**
* @HystrixCommand 表示熔断器,一般服务生产者无法响应时,服务调用者会自调用 fallbackMethod
* 中的方法并返回,如下方法 hiError
* @param name
* @return
*/
@HystrixCommand(fallbackMethod="hiError")
public String hiService(String name)
{
//参数里url中的"PRODUCT-SERVICE"就是服务生产者的应用名,配制在application.yml中,
// 如 spring:application:name: product-service,这个名称与生产者的服务端口无关
return restTemplate.getForObject("http://PRODUCT-SERVICE/service/hi?name=" + name, String.class);
}
public String hiError(String name){
return "this is happend error==name :" + name;
}
}
controller
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate()
{
return new RestTemplate();
}
}
二、部署并启动
1、启动eureka,接受服务注册
访问 http://localhost:8000/ 效果如下,说明启动成功
2、启动三个服务生产者
server:
port: 8001
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/ ## 注册服务到eureka里去
spring:
application:
name: product-service
上面是服务生产者的application.yml,修改server.port的值为,8001、8002、8003,并分别打三个jar包,结果保证有三个服务生产者,端口分别是8001、8002、8003,
我这里三个jar的分名字为 product-server-1-1.0.jar、product-server-2-1.0.jar、product-server-3-1.0.jar,然后分别启动三个包,
此刻刷新注册中心 eureka结果如下
说明三个服务生产者已经成功注册到eureka中
3、启动服务消费者,刷新下eureka应用结果如下,
consumer-service也成功注册了
4、访问消费者地址 http://localhost:8020/consumer/hi?name=2323 ,看是否成功返回且负载均衡也生效
访问三次,结果分别如下
hi 2323,i am from port:8001
hi 2323,i am from port:8003
hi 2323,i am from port:8003
至此我们的一个简单的基于Ribbon+RestTemplate的springcloud框架已经搭建完成
总结下
我们总共三个应用,一个注册中心用来注册服务,一个服务生产者,一个服务消费者,服务消费者通过Ribbon+RestTemplate的方式访问生产者,
源码如下
https://gitee.com/xing_xin/springclouddemo-1.git