SpringCloud是一个分布式的总体解决方案。Spring Cloud为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局锁,leader选举.分布式session,集群状态)中快速构建的工具,使用SpringCloud的开发者能够快速的启动服务或构建应用、同时可以快速和云平台资源进行对接。本篇只讲述SpringBoot与SpringCloud的整合以及简单使用,若要详细学习SpringCloud请参考其余文章或官方文档。java
一.Spring Cloud分布式开发五大经常使用组件web
1.服务发现 --- Netfix Eurekaspring
2.客户端负载均衡 --- Netfix Ribbonsession
3.断路器 --- Netfix Hystrixapp
4.服务网关 --- Netfix Zuul负载均衡
5.分布式配置 --- Spring Cloud Configmaven
二.建立Eureka注册中心
建立一个空的项目,在该项目下建立一个eureka-server模块。分布式
eureka-server所须要的依赖:ide
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>1.4.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2.1 配置eureka相关信息spring-boot
server:
port: 8761 eureka: instance: hostname: eureka-server #eureka实例的主机名 client: register-with-eureka: false #不把本身注册到eureka上 fetch-registry: false #不从eureka上来获取服务的注册信息 service-url: defaultZon: http://localhost:8761/eureka/
2.2 开启注册中心功能 @EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
启动时eureka-server,若启动报错:java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.<init>([Ljava,则更换SpringBoot版本为1.5.12.RELEASE
三.服务提供者注册服务
3.1 建立应用provider-ticket
导入eureka依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>1.4.4.RELEASE</version> </dependency>
@RestController public class TicketController { @Autowired TicketService ticketService; @GetMapping("/ticket") public String getTicket(){ System.out.println("8002端口应用"); return ticketService.getTicket(); } }
@Service public class TicketService { public String getTicket(){ return "《海王》"; } }
3.2 配置服务
server:
port: 8002
spring:
application:
name: provider-ticket
eureka:
instance:
prefer-ip-address: true #注册服务的时候使用服务的ip地址
client:
service-url:
defaultZon: http://localhost:8761/eureka/
启动时若报错则跟换SpringBoot的版本为1.5.12.RELEASE版本。
3.3 注册多个服务
首先将服务用maven工具打包成jar,打包的时候遇到了一些问题。是SpringBoot与SpringCloud的版本不匹配致使的。下面是二者的版本对应明细
若是仍是报错,看一下eureka-server项目是否成功启动了,在服务注册期间eureka-server要保持运行状态,打包成功后,修改provider-ticket的端口号:
server:
port: 8002
再次打包,而后使用java -jar provider-ticket-0.0.1-SNAPSHOT.jar命令分别启动两个jar包项目。查看http://localhost:8761/
上述状态说明两个服务已经成功地在Eureka上注册了。
四.发现消费服务
4.1 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
4.2 在启动类开启发现服务功能,并配置RestTemplate
@EnableDiscoveryClient //开启发现服务功能 @SpringBootApplication public class ConsumerUserApplication { public static void main(String[] args) { SpringApplication.run(ConsumerUserApplication.class, args); } @LoadBalanced //使用负载均衡机制 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
4.3 配置发现服务信息
spring:
application:
name: consumer-user
server:
port: 8200
eureka:
instance:
prefer-ip-address: true #注册服务的时候使用服务的ip地址
client:
service-url:
defaultZon: http://localhost:8761/eureka/
4.4 调用服务
@RestController public class UserController { @Autowired RestTemplate restTemplate; @GetMapping("/") @ResponseBody public String buyTicket(){ String str = restTemplate.getForObject("http://PROVIDER-TICKET/ticket", String.class); return str; } }
4.5 测试
启动consumer-user应用,访问http://localhost:8200/,查看是否有返回值,刷新页面看是否启用了负载均衡,将eureka中的两个服务都调用了。