一、 概述
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
SpringCloud分布式开发五大常用组件
- 服务发现——Netflix Eureka
- 客服端负载均衡——Netflix Ribbon
- 断路器——Netflix Hystrix
- 服务网关——Netflix Zuul
- 分布式配置——Spring Cloud Config
二、入门实验
本实验主要是演示Spring Cloud 分布式的实现和效果
首先,创建一个空项目,再创建三个模块,分别是Eureka注册中心、生产者、消费者模块
Eureka注册中心模块
(1)导入依赖
(2)配置文件
server:
port: 8761
eureka:
instance:
hostname: eureka-server # eureka实例的主机名
client:
register-with-eureka: false #不把自己注册到eureka上
fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://localhost:8761/eureka/
启动启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
访问 http://localhost:8761/
生产者模块
(1)导入依赖
(2)配置文件
server:
port: 8002
spring:
application:
name: provider
eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/
(3)编写controller层和service层demo
@RestController
public class ProController {
@Autowired
ProviderService providerService;
@GetMapping("/ticket")
public String getTicket() {
return providerService.getTicket();
}
}
@Service
public class ProviderService {
public String getTicket() {
System.out.println("8002");
return "《厉害了,我的国》";
}
}
启动启动类,注意Eureka注册中心启动类不要停止
刷新页面你会看到provider已经注册进来了
消费者模块
(1)导入依赖
(2)配置文件
spring:
application:
name: consumer
server:
port: 8200
eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/
(3)向容器中注入RestTemplate, 并使用@EnableDiscoveryClient开启发现服务功能
@SpringBootApplication
@EnableDiscoveryClient //开启发现服务功能
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@LoadBalanced //使用负载均衡机制
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
(4)编写controller并使用RestTemplate发现服务
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/buy")
public String buyTicket(String name) {
String s = restTemplate.getForObject("http://PROVIDER/ticket", String.class);
return name + "购买了" + s;
}
}
向http://localhost:8200/buy?name=zhangsan发请求,则会响应
zhangsan购买了《厉害了,我的国》
并且在使用了@LoadBalanced之后实现了负载均衡,如果创建不同端口的provider应用,则访问会被均衡到各个应用
刷新一次http://localhost:8200/buy?name=zhangsan
再刷新多次,这就是负载均衡的效果