之前,我们使用了Zookeeper+Dubbo(见文章《Spring Boot与分布式Dubbo/Zookeeper》),现在我们整合Spring Cloud来做分布式应用
一、SpringCloud和Dubbo的区别
Dubbo是一个分布式服务框架,主要解决服务与服务之间远程过程调用问题(RPC);而SpringCloud是分布式的整体解决方案。也就是说,在分布式系统中,需要考虑的几乎所以问题,Spring Cloud都有对应的解决方案。
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
SpringCloud 分布式开发五大常用组件
服务发现 ——Netflix Eureka
客服端负载均衡 ——Netflix Ribbon
断路器 ——Netflix Hystrix
服务网关 ——Netflix Zuul
分布式配置 ——Spring Cloud Config
二、SpringCloud 入门案例
1、注册中心模块 Netflix Eureka
/**
* 注册中心
* 1、配置Eureka信息
* 2、@EnableEurekaServer 启用注册中心的功能
*/
@EnableEurekaServer //启用注册中心的功能
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
(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
(3) 访问Eureka注册中心的界面
2、服务提供者模块
同时将服务注册到注册中心
Spring Cloud整合微服务,是通过轻量级http进行通信的。
(1)编写service业务和controller
@Service
public class TicketService {
public String getTicket(){
return "一张电影票《我喜欢你》";
}
}
@RestController
public class TicketController {
@Autowired
private TicketService ticketService;
@GetMapping("/get/ticket")
public String getTicket(){
String ticket = ticketService.getTicket();
return ticket;
}
}
(2)将服务提供者的业务注册到Eureka
server: port: 8001
spring:
application:
name: provider-ticket
eureka:
instance:
prefer-ip-address: true # 注册服务时使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka
(3)启动注册中心和服务提供方
(4)把同一个应用部署多个实例,注册到注册中心
(1)将服务提供者provider-ticket 打jar包 (maven package)
(2)修改服务提供者provider-ticket 的servet端口,再次打包
(3) 同一个应用如何在eureka注册中心注册多个
(4)
3、服务消费者模块
如何消费这些服务
(1)配置文件
spring: application:
name: comsumer
server:
port: 8020
# 注册到Eureka
eureka:
instance:
prefer-ip-address: true # 注册服务时使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka
# 从注册中心发现服务
(2)使用@EnableDiscoveryClient
开启服务发现功能
@EnableDiscoveryClient //开启服务发现功能
@RestController
public class UserController {
@GetMapping("/buy")
public String buyTicket(String name){
return name + "买票成功~";
}
}
(3) 消费服务:使用restTemplate请求远程的PROVIDER-TICKET
package com.dhu.comsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ComsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ComsumerApplication.class, args);
}
@LoadBalanced //启动负载均衡机制
@Bean
//发送http请求
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
package com.dhu.comsumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author zhou
* @create 2020/6/11
*/
@EnableDiscoveryClient //开启服务发现功能
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/buy")
public String buyTicket(String name){
//消费服务
String s = restTemplate.getForObject("http://PROVIDER-TICKET/get/ticket", String.class);
return name + "买票"+s+"成功~";
}
}
(4)