Spring Cloud和Dubbo是国内主流的微服务框架, 二者各有所长。 目前公司后台使用的是SpringMVC+Dubbo, 准备将接口层服务改造为Spring Cloud架构。
个人觉得Spring Cloud更加灵活、部署方便, 适用于为APP、WEB提供接口的服务, 以支持APP频繁的上线需求。Spring Cloud使用REST短连接方式实现各服务交互, Dubbo使用RPC长连接方式实现服务交互。
SpringCloud的组件很多, 其中Eureka是服务注册和发现组件, 作用跟zookeeper差不多, 就是动态的添加或删除服务。
创建Eureka服务进程:
打开IntelliJ Idea -> Create New Project -> Spring Intializr -> 设置包名 -> 勾选Enreka Server -> next
可以看到Dependecies有很多选项, 都是Spring Cloud可以使用的组件。 本工程要作为注册中心服务进程, 所有选中Eureka Server就行了。
查看工程代码, 添加@SpringBootApplication的类是程序入口类, 只需要再添加注解@EnableEnrekaServer就能声明当前工程为Eureka服务进程了。
Spring Cloud和Spring MVC工程有个区别, SpringMVC工程要配置tomcat运行参数, 而Spring Cloud工程默认会配置运行参数为入口类。
打开application.yml文件并设置如下参数:
#yml文件缩进2个空格
server:
port: 10001
spring:
application:
name:enreka
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
表示server.port=10001, spring.application.name=enreka, eureka.instance.hostname=localhost等等, 其中eureka.client.registerWithEureka和eureka.client.fetchRegistry为false,表示当前工程是Eureka服务。
用浏览器打开http://localhost:10001会看到管理界面(能看到所有已注册的服务,跟zookeeper差不多)。
好了, 注册中心已经有了, 下面再搞了工程注册到Euraka服务里。
IntelliJ Idea -> Create New Project -> Spring Intializr -> 设置包名 -> 勾选Enreka Discovery -> next
在入口类添加注解@EnableEnrekaClient, 表明当前服务是Eureka客户端。
@EnableEurekaClient
@SpringBootApplication
public class Helloservice1Application {
public static void main(String[] args) {
SpringApplication.run(Helloservice1Application.class, args);
}
}
修改application.yml文件:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10001/eureka/
server:
port: 10002
spring:
application:
name: service-hello1
eureka.client.serviceUrl.defaultZone就是Enreka服务端地址, 使用多个Eureka服务时使用逗号分隔(跟zookeeper写法一样)。 例如:
eureka.client.serviceUrl.defaultZone=http://localhost:10001/enreka,http://localhost:10010/enreka,http://localhost:10011/enreka
PS: 向Eureka集群注册的好处是某个Eureka服务挂掉了,还可以访问其它Eureka服务。
spring.application.name是服务名称, 在Spring Cloud框架里是区分各服务的唯一标识,zuul网关路由时会用到。新建一个Java文件, 添加注解@RestController表示它是一个接口类
@RestController
public class HelloController {
@Value("${server.port}")
String port; //在application.yml文件里赋的值
@RequestMapping("hello")
public String doHello(@RequestParam String param) {
return param + ":" + "port is " + port;
}
}
运行当前程序并在浏览器输入: http://localhost:10002/hello?param=“zhangsan”
浏览器会显示:"zhangsan":port is 10002
在浏览器输入http://localhost:10001 , 可以看到service-hello1服务已注册。 Status值UP表示服务可用。
关闭服务后Status会变为Down,表示服务不可用。
Eureka通过心跳方式判断服务是否可用, 当服务挂掉后Status变为Down, 服务重新OK后Status自动变为UP, 这就是Enreka的动态服务发现功能;