SpringCloud
SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、负载均衡、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。另外说明spring cloud是基于Springboot的,所以需要开发中对Springboot有一定的了解,如果不了解的话可以看蚂蚁课堂SpringBoot课程。
服务提供者与消费关系
服务提供者:提供服务被人调用
消费者:调用被人服务
服务的注册与发现(Eureka )
在这里,我们需要用的的组件上Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。
什么是Eureka
官方的介绍在这里Eureka wiki。Eureka是Netflix开源的一个RESTful服务,主要用于服务的注册发现。Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
在我看来,Eureka的吸引力来源于以下几点:
开源:大家可以对实现一探究竟,甚至修改源码。
可靠:经过Netflix多年的生产环境考验,使用应该比较靠谱省心
功能齐全:不但提供了完整的注册发现服务,还有Ribbon等可以配合使用的服务。
基于Java:对于Java程序员来说,使用起来,心里比较有底。
spring cloud可以使用Spring Cloud, 与Eureka进行了很好的集成,使用起来非常方便。
生产者消费者案例
一、创建springcloud_eureka_service项目
1 向pom文件添加依赖
<dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId> dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>Greenwich.RELEASEversion> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement>
2 编写application.yml文件
##应用名称 spring: application: name: euraka-server #声明当前 eurakaserver端口号 server: port: 8888 #配置eureka eureka: client: #代表自己是否注册到注册中心去 register-with-eureka: false #表明自己是注册中心 fetch-registry: false #配置地址 service-url: defaultZone: http://localhost:8888/eureka
3 创建启动程序类
@SpringBootApplication @EnableEurekaServer public class StartEurekaService { public static void main(String[] args) { SpringApplication.run(StartEurekaService.class,args); } }
4 运行效果
二、创建生产者项目springcloud_eureka_provider
1 向pom文件导入依赖
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId> dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>Greenwich.RELEASEversion> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement>
2 创建service接口
public interface IDoSomeService { public String doSome(); }
3 创建service接口实现类
@RestController public class IDoSomeServiceImpl implements IDoSomeService { @RequestMapping("/doSome") @Override public String doSome() { System.out.println("服务提供者"); return "eureka"; } }
4 编写application.yml文件
##应用名称 spring: application: name: euraka-provider #声明当前 eurakaserver端口号 server: port: 8885 #配置eureka eureka: client: #配置地址 service-url: defaultZone: http://localhost:8888/eureka
5 创建启动程序类
@SpringBootApplication @EnableEurekaClient public class StartProvider { public static void main(String[] args) { SpringApplication.run(StartProvider.class,args); } }
6 运行效果
三、创建消费者项目springcloud_euraka_consumer
1 向pom文件导入节点
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId> dependency> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-starter-openfeignartifactId> dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloudgroupId> <artifactId>spring-cloud-dependenciesartifactId> <version>Greenwich.RELEASEversion> <type>pomtype> <scope>importscope> dependency> dependencies> dependencyManagement>
2 创建service接口
@FeignClient("euraka-provider") public interface IDoSomeService { @RequestMapping("/doSome") public String doSome(); }
3 编写application.yml文件
##应用名称 spring: application: name: euraka-comsumer #声明当前 eurakaserver端口号 server: port: 8881 #配置eureka eureka: client: #配置地址 service-url: defaultZone: http://localhost:8888/eureka
4 创建Controller层
@RestController public class IDoSomeController { /* @Resource private RestTemplate restTemplate;*/ @Resource private IDoSomeService iDoSomeService; @RequestMapping("/doSome") public String doSme(){ System.out.println("ConsumerController"); /*return restTemplate.getForObject("http://euraka-provider/doSome",String.class);*/ return iDoSomeService.doSome(); } }
5 编写程序启动类
@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class StartProvider { public static void main(String[] args) { SpringApplication.run(StartProvider.class,args); } /* @Bean @LoadBalanced //实现负载均衡 RestTemplate restTemplate(){ return new RestTemplate(); }*/ //指定负载均衡策略随即 @Bean public IRule ribbonRule(){ return new RandomRule(); } }
6 运行效果