一、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服务成功!
