有过dubbo/dubbox使用经验的朋友,看到下面这张图,一定很熟悉,就是SOA架构的最基本套路。
与dubbo对比,上图的3大要素中,spring cloud是借助以下组件来实现的:
1、注册中心:
spring cloud默认使用eureka server来做注册中心,而dubbo默认使用的是zookeeper。eureka的注册信息是保存在一个双层的Map对象中的,换句话说在内存中,不象zookeeper是长久保存在节点中。
2、服务提供方:
spring-web(Spring MVC)提供了完善的http rest服务框架,用这一套就能提供rest服务。(目前spring cloud官方提供的示例基本上都是http rest服务,理论上讲,应该也可以扩展成rpc服务,而dubbo是以rpc为主的,这点有些区别)
3、服务消费方:
依赖于spring-web,负载均衡采用ribbon组件来完成,大致原理是从注册中心发现可用服务的信息,缓存在本地,然后按一定的负载均衡算法进行调用。(跟dubbo类似,只不过dubbo是自己实现的负载均衡)
下面是这三方的最基本示例:
一、项目结构
注:spring-cloud是完全基于Spring Boot来构建项目的,所以对spring boot不熟悉的,建议先看本博客的spring boot系列。
register-center 即 eureka 注册中心
service-api 为服务契约
service-consumer 为服务消费方
service-provider 为服务提供方
二、register-center
2.1 依赖项
buildscript { repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.4.RELEASE") } } apply plugin: 'spring-boot' dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE" } } dependencies { compile 'org.springframework.cloud:spring-cloud-starter-eureka-server' compile 'org.springframework.boot:spring-boot-starter-actuator' testCompile 'org.springframework.boot:spring-boot-starter-test' }
2.2 main入口程序
package com.cnblogs.yjmyzz.spring.cloud.study; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * Created by 菩提树下的杨过 on 2017/6/17. */ @SpringBootApplication @EnableEurekaServer public class RegisterServer { public static void main(String[] args) { SpringApplication.run(RegisterServer.class, args); } }
主要是靠最上面的@EnableEurekaServer这个注解,其它完全没有花头。
2.3 配置
server: port: 8000 eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:8000/eureka
解释一下:
注册中心本身也是一个服务,也可以当成普通服务向其它注册中心来注册,由于本示例中,只有一个eureka server自己就充当注册中心,也不需要跟其它注册中心同步注册信息,所以都设置成false。最后一行的defaultZone,初次接触可以先不管,先理解成注册中心对外暴露的地址即可。
2.4 启动
启动后,浏览http://localhost:8000/,可以看到类似下图:
现在没有任何服务注册,所以在Application里,显示No instances available.
三、service-api
为了方便后面讲解,先定义一个服务接口,以及对应的DTO
package com.cnblogs.yjmyzz.spring.cloud.study.api; import com.cnblogs.yjmyzz.spring.cloud.study.dto.UserDTO; /** * Created by 菩提树下的杨过 on 2017/6/17. */ public interface UserService { UserDTO findUser(Integer userId); }
以及
package com.cnblogs.yjmyzz.spring.cloud.study.dto; import lombok.Data; /** * Created by