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服务。
       运行程序, 最终会提示Started EnrekaServerDemoApplication,即程序入口类。


        用浏览器打开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的动态服务发现功能;

  



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐