整合SpringCloud
1.关于spring cloud
Spring Cloud是一个分布式的整体解决方案;
Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐, leader选举,分布式session,集群状态)中快速构建的工具;
SpringCloud分布式开发五大常用组件
• 服务发现——Netflix Eureka ->服务的注册中心,服务提供者将服务的地址注册到注册中心,客户端需要调动服务时,从注册中心中找服务的地址
• 客服端负载均衡——Netflix Ribbon ->例如:服务A要调用服务B,B部署了多个实例,A到底要调哪台机器上的B服务
• 断路器——Netflix Hystrix ->例如:服务A调服务B,B也调用了C,C调用了D;如果在一次调用中C服务出现了问题,导致一直重试而进入漫长等待,使用断路器可以在几次重试失败后响应失败,从而防止一直等地啊下去;
• 服务网关——Netflix Zuul ->用来过滤一些请求;
• 分布式配置——Spring Cloud Config
2.整合spring cloud
新建一个空工程,里面放三个模块:注册中心、服务提供者、服务消费者
1)注册中心模块
使用spirng初始化器新建一个模块,选Eureka Server
yml配置:
server: port: 8761 eureka: instance: #erueka实例的主机名 hostname: eureka-server client: register-with-eureka: false #不把自己注册到erueka上(不做高可用时这么配置) fetch-registry: false #不从erueka上获取服务的注册信息 service-url: defaultZone: http://localhost:8761/eureka/
启用注册中心:
在工程启动类上加注解
@EnableEurekaServer
启动注册中心模块的启动类,浏览器访问:localhost:8761,可以看到注册中心管理页面:
2)服务提供者
新建一个模块,选Eureka Discover Client
主要步骤:
编写服务接口;
在yml中配置注册服务;
业务类:
@Service public class SellService { public String sell(){ return "《mzd最后的革命》"; } }
controller:
@RestController public class SellController { @Autowired private SellService sellService; @RequestMapping("/sell") public String sell(){ return sellService.sell(); } }
yml配置:
server: port: 8001 spring: application: name: provider-server eureka: instance: prefer-ip-address: true #注册服务时,使用服务的ip地址 client: service-url: defaultZone: http://localhost:8761/eureka/ #注册中心地址
测试:
启动provider服务、访问/sell接口、刷新Eureka注册中心管理页面
可以看到,注册中心管理页面中多了一条服务:
也可以个同一个服务提供者在注册中心注册多个实例:
使用mvn package 将模块打包;
将打成的jar包复制多份,分别在cmd中使用java -jar xxx命令运行;
3)服务消费者
新建一个模块选Eureka Discover Client
在启动类中添加注解,开启从注册中心发现服务的功能:
@EnableDiscoveryClient
配置类:
为了请求服务提供者提供的接口,需要用到RestTemplate;
用@Bean将RestTemplate的实例注册到ioc容器中;
@Configuration public class BuyConfig { /** * 用来发送http请求 * @return */ @LoadBalanced //启用负载均衡机制 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
controller:
调用注册中心中注册的服务来实现业务
@RestController public class BuyController { @Autowired private RestTemplate template; @RequestMapping("/buy") public String buy(){ //使用RestTemplate来发送http请求, // 参数1:http:// + eureka中注册的服务名 + 接口名 //参数2:接口返回值的类型 String book = template.getForObject("http://PROVIDER-SERVER/sell", String.class); return "买到了:" + book; } }
yml配置:
server: port: 8200 spring: application: name: consumer eureka: instance: prefer-ip-address: true #注册服务时,使用服务的ip地址 client: service-url: defaultZone: http://localhost:8761/eureka/ #注册中心地址
测试:
启动消费者服务、刷新注册中心管理页、请求消费接口
结果:
注册中心中多了消费者服务
消费者成功调用了服务提供者的接口: