一、SpringCloud是什么 度娘:Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署
个人理解:可以发现SringCloud拥有服务发现注册、负载均衡的功能,而这两个功能,正好是dubbo所具有的功能,SpringCloud的出现,目的就是消灭分布式框架被dubbo霸气独占的局面,SpringCloud在实现服务发现注册和管控的基础上,增加了配置中心、消息总线、负载均衡、断路器、数据监控等功能。
二、SpringCloud与Dubbo的功能对比 背景 Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点,经过不断优化,阿里把自己的核心框架对外进行开源使用,这也是阿里近几年在国内开源社区影响力较大的原因,毕竟阿里在开源社区不少做贡献,例如JStorm捐赠给Apache并加入Apache基金会等,阿里在国内眼中,已经不仅仅是一家电商公司,阿里的生态系统,让国人为之震撼,人工智能、智能点餐、无人酒店,让阿里逐步变成了一家科技领头公司。
Spring Cloud,从命名就可以知道,它是Spring Source的产物,Spring社区的强大背书可以说是Java企业界最有影响力的组织了,除了Spring Source之外,还有Pivotal和Netfix是其强大的后盾与技术输出。其中Netflix开源的整套微服务架构套件是Spring Cloud的核心。
如果拿Dubbo和Netflix对比,dubbo在国内的影响力无疑是最大的,而Netflix 面向的是国际,在国际影响力上,Netflix 无疑是大佬。无论出身如何,这些架构都能在处理分布式问题时,提供很大的帮助。
功能架构 下表是dubbot和SpringCloud功能架构对比表
包含功能 
Dubbo 
SpringCloud 
 
 
服务注册中心 
Zookeeper 
Spring Cloud Netflix Eureka 
 
服务调用方式 
RPC 
REST API 
 
服务网关 
无 
Spring Cloud Netflix Zuul 
 
断路器 
不完善 
Spring Cloud Netflix Hystrix 
 
分布式配置 
无 
Spring Cloud Config 
 
服务跟踪 
无 
Spring Cloud Sleuth 
 
消息总线 
无 
Spring Cloud Bus 
 
数据流 
无 
Spring Cloud Stream 
 
批量任务 
无 
Spring Cloud Task 
 
more…… 
more…… 
more…… 
 
 
三、开始整合SpringCloud 搭建maven多模块工程(分别为服务注册中心工程eureka-server,服务提供者provider-ticket,服务消费者consumer-user),项目架构图如下
搭建父工程 1.搭建父工程SpringCloudDemo,pom文件配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <project  xmlns ="http://maven.apache.org/POM/4.0.0"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >   <modelVersion > 4.0.0</modelVersion >    <groupId > com.yang.study</groupId >    <artifactId > SpringCloudDemo</artifactId >    <version > 0.0.1-SNAPSHOT</version >    <packaging > pom</packaging >    <modules >    	<module > eureka-server</module >    	<module > consumer-user</module >    	<module > provider-ticket</module >    </modules >    	<properties >  		<spring-cloud.version > Edgware.SR3</spring-cloud.version >  	</properties >  </project > 
 
搭建服务注册中心 2.搭建服务注册中心ureka-server,pom文件配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <?xml version="1.0"?> <project  	xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"  	xmlns ="http://maven.apache.org/POM/4.0.0"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" > 	<modelVersion > 4.0.0</modelVersion >  	<parent >  		<groupId > com.yang.study</groupId >  		<artifactId > SpringCloudDemo</artifactId >  		<version > 0.0.1-SNAPSHOT</version >  	</parent >  	<groupId > com.yang.study</groupId >  	<artifactId > eureka-server</artifactId >  	<version > 0.0.1-SNAPSHOT</version >  	<name > eureka-server</name >  	 	<dependencies >  		<dependency >  			<groupId > org.springframework.cloud</groupId >  			<artifactId > spring-cloud-starter-eureka-server</artifactId >  			 		</dependency >  	</dependencies >  	<dependencyManagement >  		<dependencies >  			<dependency >  				<groupId > org.springframework.cloud</groupId >  				<artifactId > spring-cloud-dependencies</artifactId >  				<version > ${spring-cloud.version}</version >  				<type > pom</type >  				<scope > import</scope >  			</dependency >  		</dependencies >  	</dependencyManagement >  </project > 
 
3.编写全局配置文件application.yml
1 2 3 4 5 6 7 8 9 10 server:   port:  8761 eureka:   instance:     hostname:  eureka-server     client:     register-with-eureka:  false      fetch-registry:  false      service-url:       defaultZone:  http://localhost:8761/eureka/ 
 
4.在java文件夹下创建包名org.eureka.server,并创建服务启动类EurekaServerApplication
1 2 3 4 5 6 7 8 9 10 11 12 13 package  org.eureka.server;import  org.springframework.boot.SpringApplication;import  org.springframework.boot.autoconfigure.SpringBootApplication;import  org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer @SpringBootApplication public  class  EurekaServerApplication   {	public  static  void  main (String[] args)   { 		SpringApplication.run(EurekaServerApplication .class, args); 	} } 
 
5.启动服务启动类,浏览器访问localhost:8761,显示如下
编写服务提供者 6.创建服务提供者工程provider-ticket,看标题就知道,又是售票的,哈哈,pom文件如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <?xml version="1.0"?> <project  	xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"  	xmlns ="http://maven.apache.org/POM/4.0.0"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" > 	<modelVersion > 4.0.0</modelVersion >  	<parent >  		<groupId > org.springframework.boot</groupId >  		<artifactId > spring-boot-starter-parent</artifactId >  		<version > 1.5.2.RELEASE</version >  	</parent >  	<groupId > com.yang.study</groupId >  	<artifactId > provider-ticket</artifactId >  	<version > 0.0.1-SNAPSHOT</version >  	<name > provider-ticket</name >  	<url > http://maven.apache.org</url >  	<properties >  		<project.build.sourceEncoding > UTF-8</project.build.sourceEncoding >  		<spring-cloud.version > Edgware.SR3</spring-cloud.version >  	</properties >  	 	<dependencies >  		 		<dependency >  			<groupId > org.springframework.boot</groupId >  			<artifactId > spring-boot-starter-web</artifactId >  		</dependency >  		<dependency >  			<groupId > org.springframework.cloud</groupId >  			<artifactId > spring-cloud-starter-eureka</artifactId >  		</dependency >  	</dependencies >  	<dependencyManagement >  		<dependencies >  			<dependency >  				<groupId > org.springframework.cloud</groupId >  				<artifactId > spring-cloud-dependencies</artifactId >  				<version > ${spring-cloud.version}</version >  				<type > pom</type >  				<scope > import</scope >  			</dependency >  		</dependencies >  	</dependencyManagement >  	<build >    <plugins >    	<plugin >    		<groupId > org.springframework.boot</groupId >   		<artifactId > spring-boot-maven-plugin</artifactId >    	</plugin >    </plugins >   </build >  </project > 
 
7.全局配置文件如下application.yml,Spring.application.name是应用的名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 server:   port:  8002 spring:   application:     name:  provider-ticket eureka:   instance:     prefer-ip-address:  true    client:     service-url:        defaultZone:  http://localhost:8761/eureka/ 
 
8.创建常用包名(org.provider.controller\org.provider.service\org.provider.service\org.provider.service.impl),在service创建售票服务类接口。
1 2 3 4 5 6 7 8 9 10 package  org.provider.service;public  interface  TicketService  {	public  String buyTicket ()  ; } 
 
9.在service.impl创建服务实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package  org.provider.service.impl;import  org.provider.service.TicketService;import  org.springframework.beans.factory.annotation.Value;import  org.springframework.stereotype.Service;@Service public  class  TicketServiceImpl  implements  TicketService   {	@Value ("${server.port}" ) 	private  String port; 	public  String buyTicket ()   { 		System.out.println(port); 		return  "《疯狂的石头》" ; 	} } 
 
10.在controll创建控制器TicketController,自己测试接口是否可用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package  org.provider.controller;import  org.provider.service.TicketService;import  org.springframework.beans.factory.annotation.Autowired;import  org.springframework.beans.factory.annotation.Value;import  org.springframework.web.bind.annotation.GetMapping;import  org.springframework.web.bind.annotation.RestController;  @RestController public  class  TicketController   {	     @Autowired      private  TicketService ticketService;          @GetMapping ("/ticket" )     public  String getTicker ()  {         return  ticketService.buyTicket();     } } 
 
11.在ticket创建服务启动类ProviderApplication
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package  org.provider.ticket;import  org.springframework.boot.SpringApplication;import  org.springframework.boot.autoconfigure.SpringBootApplication;import  org.springframework.cloud.netflix.eureka.EnableEurekaClient;import  org.springframework.context.annotation.ComponentScan;@SpringBootApplication @EnableEurekaClient @ComponentScan ("org.provider" ) public  class  ProviderApplication   {    public  static  void  main (String[] args)   {         SpringApplication.run(ProviderApplication.class, args);     } } 
 
12.右键启动服务启动类,查看启动日志
13.访问服务注册中心,查看
14.访问本地接口,看服务是否可用
编写服务消费者 15.创建服务消费者工程consumer-user,pom文件如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <?xml version="1.0"?> <project  	xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"  	xmlns ="http://maven.apache.org/POM/4.0.0"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" > 	<modelVersion > 4.0.0</modelVersion >  	<parent >  		<groupId > org.springframework.boot</groupId >  		<artifactId > spring-boot-starter-parent</artifactId >  		<version > 1.5.2.RELEASE</version >  	</parent >  	<groupId > com.yang.study</groupId >  	<artifactId > consumer-user</artifactId >  	<version > 0.0.1-SNAPSHOT</version >  	<name > consumer-user</name >  	<url > http://maven.apache.org</url >  	<properties >  		<project.build.sourceEncoding > UTF-8</project.build.sourceEncoding >  		<spring-cloud.version > Edgware.SR3</spring-cloud.version >  	</properties >  	<dependencies >  		<dependency >  			<groupId > org.springframework.cloud</groupId >  			<artifactId > spring-cloud-starter-eureka</artifactId >  		</dependency >  		<dependency >  			<groupId > org.springframework.boot</groupId >  			<artifactId > spring-boot-starter-test</artifactId >  			<scope > test</scope >  		</dependency >  	</dependencies >  	<dependencyManagement >  		<dependencies >  			<dependency >  				<groupId > org.springframework.cloud</groupId >  				<artifactId > spring-cloud-dependencies</artifactId >  				<version > ${spring-cloud.version}</version >  				<type > pom</type >  				<scope > import</scope >  			</dependency >  		</dependencies >  	</dependencyManagement >  </project > 
 
16.消费者工程全局配置文件application.yml如下
1 2 3 4 5 6 7 8 9 10 11 12 spring:   application:     name:  consumer-user server:   port:  8200 eureka:   instance:     prefer-ip-address:  true    client:     service-url:       defaultZone:  http://localhost:8761/eureka/ 
 
17.创建包名(org.consumer.control\org.consumer.user),编写控制器UserController,并注入RestTemplate对象,RestTemplate对象用于在SpringCloud发现服务并调用来用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package  org.consumer.control;import  org.springframework.beans.factory.annotation.Autowired;import  org.springframework.web.bind.annotation.GetMapping;import  org.springframework.web.bind.annotation.RestController;import  org.springframework.web.client.RestTemplate;@RestController public  class  UserController   {    @Autowired      RestTemplate restTemplate;     @GetMapping ("/buy" )     public  String butTicket (String name)  {         String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticket/" , String.class);         return  name+"购买了" +s;     } } 
 
18.编写消费者服务启动类ConsumerApplication,并运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package  org.consumer.user;import  org.springframework.boot.SpringApplication;import  org.springframework.boot.autoconfigure.SpringBootApplication;import  org.springframework.cloud.client.discovery.EnableDiscoveryClient;import  org.springframework.cloud.client.loadbalancer.LoadBalanced;import  org.springframework.context.annotation.Bean;import  org.springframework.context.annotation.ComponentScan;import  org.springframework.web.client.RestTemplate;@ComponentScan ("org.consumer" )@EnableDiscoveryClient @SpringBootApplication public  class  ConsumerApplication   {    public  static  void  main (String[] args)   {         SpringApplication.run(ConsumerApplication.class, args);     }     @LoadBalanced      @Bean      public  RestTemplate restTemplate ()  {         return  new  RestTemplate();              } } 
 
19.查看服务注册中心
20.访问服务地址,进行消费者调用验证,验证成功图如下,SpringCloud搭建完成
四、总结注意点及源码下载地址 1.消费者和服务提供者的全局配置文件中需要配置注册中心的地址:为eureka.client.service-url-defaultZone
2.消费者调用服务提供者接口,采用RestTemplate对象,不懂的可以百度查一下
源码下载地址(gitHub)点击我下载,小心你的鼠标