目前主流实现:Dubbo+zookeeper和SpringBoot+Cloud
利用上述技术都可以将功能服务分散到不同服务器部署,然后实现服务间通信(调用)。
请求-->处理1-->处理2-->响应。意思可以将处理1和处理2做成独立服务分开部署,然后再进行RPC(Dubbo)或HTTP请求和响应模式(Cloud)交互。
Dubbo和Cloud的区别如下:
- Dubbo和Cloud服务调用机制不同,一个RPC、一个HTTP请求响应
- Dubbo一般和zookeeper结合管理服务,Cloud内置集成Eureka管理服务
- Cloud提供一套服务管理的完整方案、Dubbo需要跟其他技术集成使用。
- Cloud仅用于Rest服务管理、Dubbo是将组件服务化管理
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。
- Spring Cloud Netflix
是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。
- Spring Cloud Config
将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件
- Spring Cloud Bus
分布式消息队列,是对Kafka, MQ的封装
- Spring Cloud Security
对Spring Security的封装,并能配合Netflix使用
- Spring Cloud Zookeeper
对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用
-
Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。
-
创建maven project,引入pom.xml定义
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.7.RELEASE</version> <relativePath/> </parent>
<properties> <java.version>1.7</java.version> </properties>
<dependencies> <!-- springcloud-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.3.4.RELEASE</version> </dependency>
</dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
-
追加application.properties中eureka参数定义
#eureka #spring.application.name=EUREKA-SERVER eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
追加启动类,使用@EnableEurekaServer
@EnableEurekaServer//启动eureka服务器 @SpringBootApplication public class EurekaServerBootApplication {
public static void main(String[] args){ SpringApplication.run(EurekaServerBootApplication.class, args); }
}
-
启动程序测试
打开浏览器输入http://localhost:7777
-
在工程中pom.xml中引入jar包定义
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.4.RELEASE</version> </dependency> <!-- 指定导入jackson包版本,避免eureka和boot冲突 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.8</version> </dependency> </dependencies>
-
在application.properties文件追加eureka定义
spring.application.name=PAPER-SERVICE eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
在启动类前追加@EnableDiscoveryClient
@EnableDiscoveryClient @SpringBootApplication @MapperScan(basePackages="cn.xdl.ovls.paper.dao") public class PaperBootApplication {
public static void main(String[] args) { SpringApplication.run(PaperBootApplication.class, args); }
}
-
启动程序测试
先启动Eureka服务中心项目,然后启动服务项目。
浏览器输入http://localhost:7777就可以查看注册实例
-
在项目中pom.xml引入定义
<!-- ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.3.4.RELEASE</version> </dependency>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
-
在application.properties追加eureka参数
eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
创建RestTemplate对象,追加@LoadBalanced,启用ribbon负载功能
@Configuration public class RestTemplateConfiguration {
@Bean @LoadBalanced//追加ribbon负载功能 public RestTemplate createRestTemplate(){ return new RestTemplate(); }
}
-
注入RestTemplate对象,利用服务名调用Restful服务
@Autowired private RestTemplate template;
//url规则: http://注册服务名/请求名 ResponseResult result = template.getForObject( "http://SUBJECT-SERVICE/subject", ResponseResult.class);
-
在启动类前,追加@EnableDiscoveryClient
@EnableDiscoveryClient//启用服务注册和查找 @SpringBootApplication public class ExamWebBootApplication {
public static void main(String[] args){ SpringApplication.run(ExamWebBootApplication.class, args); }
}
-
启动测试
-
在pom.xml中追加ribbon和feign定义
<dependencies> <!-- ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.3.4.RELEASE</version> </dependency>
<!-- feign调用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.3.4.RELEASE</version> </dependency>
</dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.SR5</version> <type>pom</type> </dependency> </dependencies>
-
在application.properties中配置eureka参数
eureka.client.serviceUrl.defaultZone=http://localhost:7777/eureka
-
定义远程Feign接口,追加@FeignClient标记
@FeignClient(name="SUBJECT-SERVICE")//指定注册服务名 public interface SubjectRemote {
//方法参考Controller定义编写 @RequestMapping(value="/subject",method=RequestMethod.GET) public ResponseResult loadSubjects();
}
-
注入Feign接口对象调用远程服务
@Autowired private SubjectRemote subjectRemote; //利用Feign接口对象方法调用远程服务 ResponseResult result = subjectRemote.loadSubjects();
-
在主入口类中追加@EnableFeignClients和@EnableDiscoveryClient标记
@EnableFeignClients//启用Feign接口模式调用服务 @EnableDiscoveryClient//启用服务注册和查找 @SpringBootApplication public class ExamWebBootApplication {
public static void main(String[] args){ SpringApplication.run(ExamWebBootApplication.class, args); }
}
-
启动程序测试