Spring Cloud (3) Eureka – 基础

一、Eureka 简介

1、Eureka 是什么

在微服务架构中,注册中心是必不可少的角色,用于服务发现和服务治理。

在阿里的Dubbo框架中,使用Zookeeper作为注册中心。但Spring Cloud为我们提供了更多的选择,不仅自身提供了Eureka作为注册中心,此外,还支持Zookeeper、Consul(go语言编写)等第三方注册中心。

Eureka就是Spring Cloud完整微服务解决方案框架中的一部分,即注册中心。

2、Eureka 作用

Eureka作为注册中心,实现了注册中心的基本功能,如服务注册、服务发现、服务治理等等。此外,提供了一个默认的web客户端界面,方便使用者对服务进行监控。Eureka还具有可搭建集群、自我保护机制、支持Restful Api、支持注册表缓存等特殊功能。

3、Eureka 工作原理

Eureka的工作原理非常简单,如果之前学习过Dubbo,那么你会发现二者的工作方式接近一致。

Eureka工作流程图:

Eureka有如下工作步骤:

(1)启动Eureka Server。

(2)Provider(服务提供者)在Eureka Server上注册自己的服务地址(发布)。

(3)Provider定期向Eureka Server发送heart beat(心跳),以证明服务可用。

(4)Consumer(消费者)需要调用服务(订阅),去Eureka Server上寻找服务地址,并将该地址缓存在本地注册表中,下次调用时直接从缓存读取。

(5)Consumer定期去Eureka获取服务,更新本地缓存,以保证最新的服务调用。

(6)Consumer获取到服务地址后,通过RPC远程调用来消费服务。

二、Eureka Server 搭建

因为Spring Cloud基于Spring Boot(快速启动框架),因此通过主流IDE,我们可以很轻松的创建Spring Cloud项目,完成各种子项目的搭建。

本系列教程将使用JetBrains IDEA进行项目演示。

1、环境搭建

SpringBoot使用Maven框架来管理项目依赖。由于在IDEA中,一个模块就代表一个项目(与Eclipse有所不同),因此我们在创建项目时须最好将子父级项目指定为相同的Group,然后再通过不同的Artifact来区分子父级项目。

注意无需在父项目Maven配置中设置modules并将子项目设为其中的module,这是Maven聚合项目的配置方式,而聚合项目会将所有依赖打成一个包。此种方式适合单点应用,不利于分布式开发。

创建父级项目模块:

输入组名和项目名:

接下来创建子项目——Eureka Server,须选择SpringBoot工程:

如果左侧列表没有Spring Initializr选项,需要先安装并启用springboot插件。

SpringBoot可以自动为我们配置依赖,选择即可,此处我们选择Eureka Server:

Maven中自动添加了Eureka依赖(2.0之后必须使用netflix提供的组件):

resources目录下为我们自动生成了application.properties文件,这是SpringBoot的默认配置文件,建议更改后缀为yml(格式更简洁的配置文件)。

目录结构如下:

2、代码

Eureka Server的搭建非常简单,我们只需如下两步:

(1)为SpringBoot入口类添加EnableEurekaServer注解

(2)配置application.yml

spring:
  application:
    name: eureka-server # 应用名
server:
  port: 8180 # 端口
eureka:
  instance:
    hostname: localhost # 域名
#  client:
#    service-url:
#      defaultZone: http://${eureka.instance.hostname}:${server.port} # 设置要注册到的注册中心地址,此处因为是Server端,无需配置
    fetch-registry: false # 是否开启搜索服务,Server不提供服务,故应关闭
    register-with-eureka: false # 注册自己,Server不需注册自己,故应关闭

3、启动

运行入口类即可,打开浏览器输入localhost:8180可看到Eureka监控平台:

三、Demo

接下来我们依次创建生产者、消费者两个模块,测试远程调用。

1、生产者

生产者(提供者)提供服务,可供其他服务调用,同时自身也能消费其他服务。

此处我们创建一个会员服务项目。

生产者是Eureka的客户端,因此要引入相应依赖:

因为涉及到web接口编写,此处还要引入web依赖:

修改SpringBoot配置文件application.yml:

spring:
  application:
    name: eureka-provider # 应用名
server:
  port: 8181 # 端口
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8180/eureka # 指定Eureka Server地址

接下来像编写传统web项目一样创建controller和service包,编写相应代码。

目录结构:

MemberService.java

@Service
public class MemberSerivce {

    public String getMember() {
        return "member";
    }
}

MemberController.java

@RestController
public class MemberController {

    @Resource
    private MemberSerivce memberSerivce;

    @RequestMapping(value = "member",method = RequestMethod.GET)
    String getMember() {
        return memberSerivce.getMember();
    }
}

最后,不要忘了给入口类Application添加@EnableEurekaClient注解。

2、消费者

消费者同样属于Eureka客户端,因此须引入和生产者相同的依赖:Eureka Discovery和web。

此处我们创建一个订单服务项目。

修改SpringBoot配置文件application.yml:

spring:
  application:
    name: eureka-consumer # 应用名
server:
  port: 8182 # 端口
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8180/eureka # Eureka Server的地址

接下来像编写传统web项目一样创建controller和service包,编写相应代码。

目录结构:

OrderService.java

@Service
public class OrderService {

    @Resource
    private RestTemplate restTemplate;

    public String getOrder() {
        return restTemplate.getForObject("http://eureka-provider/member", String.class) + "order";
    }
}

OrderController.java

@RestController
public class OrderController {

    @Resource
    private OrderService orderService;

    @RequestMapping(value = "order", method = RequestMethod.GET)
    String getOrder() {
        return orderService.getOrder();
    }
}

最后,不要忘了给入口类Application添加@EnableEurekaClient注解。此外,还要配置一个RestTemplate类型的Bean。

@SpringBootApplication
@EnableEurekaClient
public class EurekaConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate getRestTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}

我们定义了一个返回RestTemplate的Bean的方法,并添加了@LoadBalanced注解,该注解的作用会在下一章讲解。

大功告成,现在目录结构如下:

3、测试

使用IDEA提供的控制板(底部)一键启动所有模块:

如果找不到Dashboard,可在.idea目录下的workspace.xml中添加如下代码:

<component name="RunDashboard">
    <option name="configurationTypes">
      <set>
        <option value="SpringBootApplicationConfigurationType" />
      </set>
    </option>
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
  </component>

可在Eureka监控界面中看到服务已被注册:

访问消费者接口,调用生产者提供的member服务成功!

发表评论

电子邮件地址不会被公开。