Spring boot 之 Eureka 服务注册与发现 时间: 2018-07-07 17:02 分类: JAVA ####简介 使用翻译软件对`Eureka`进行翻译,有`发现了;找到了`的意思,它是一个服务注册与发现的组件,与其类似的有`Zookeeper`、`Consul`,它是`Netflix`公司的一个开源组件,在 Spring boot 中使用非常简单。`Eureka`使用的是`http`协议进行的服务提供。 ####使用 使用过`Zookeeper`的都知道,服务注册与发现都需要先启动`Zookeeper`服务端,`Eureka`也不例外,下面简单来搭建配置一个`Eureka`服务端,新建`Maven`项目,除了`Spring boot`基础依赖,需要添加`Eureka`组件的`stater`依赖: ``` org.springframework.cloud spring-cloud-starter-eureka-server ``` 依赖包含了 spring boot web 的 starter,所以添加上面依赖后 spring boot web starter 可以不用添加了。 此处有坑,贴上完整`pom.xml`文件内容: ``` 4.0.0 com.example demo 0.0.1-SNAPSHOT jar demo Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.8.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-starter-eureka-server org.springframework.cloud spring-cloud-dependencies Dalston.SR1 pom import org.springframework.boot spring-boot-maven-plugin ``` 如果你是用 IDEA 新建的`Spring boot`项目,默认`parent`节点中`spring-boot-starter-parent`的版本是最新的,当前我新建的时候是`2.0.3`,当我做完所有配置兴致冲冲地运行程序时,一个奇怪的报错出来了,一堆看不懂的东西,只是说`classpath`有问题,根本无从下手,最后把上面的版本改为`1.5.8`,顺利运行。 `application.properties`配置使用`Eureka`组件: ``` server.port=8888 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ ``` 由于客户端配置与上面也是大同小异,`Eureka`默认会自己向自己注册,所以作为服务端,需要将`registerWithEureka`和`fetchRegistry`设置为`false`。 接下来新建`Spring boot`工程的启动类`EurekaServerApplication`: ```java @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 只要一个`@EnableEurekaServer`注解即可将一个`Spring boot`作为一个`Eureka`服务端。运行程序,打开浏览器`http://localhost:8888`: ![eureka-server.png](https://0o0.me/usr/uploads/2018/07/3602151519.png) 目前为止,`Eureka`服务端算是搭建好了,下面编写`Eureka`客户端程序: 和`Eureka`服务端差不多,先添加依赖: ``` org.springframework.cloud spring-cloud-starter-eureka ``` 注意,和上面服务端的依赖不同,此时如果没有`spring-boot-starter-web`依赖的话,就需要添加上了。 然后就是`application.properties`配置文件了,与服务端大同小异,前面也说了防止自己注册自己的问题,客户端不存在这个问题,也就不需要将上面的那两个属性设置为false: ``` server.port=8889 eureka.client.service-url.defaultZone=http://localhost:8888/eureka/ spring.application.name=eureka-client ``` 继续采坑,当采用`application.properties`方式配置`Spring boot`配置文件时,IDEA 中默认自动补全属性名并不是驼峰式的命名,而是以减号分割的形式,`Spring boot`在读取的时候会转换为驼峰式的命名。但在配置`eureka.client.service-url.defaultZone`的时候,很容易就会踩进深坑,看到 IDEA 提示都是减号分割的属性名,下意识的将`defaultZone`写成`default-zone`,后面就悲剧了,报错`TransportException: Cannot execute request on any known server`。原因是`serviceUrl`是一个`Map`属性,设值的时候不是调的`setter`方法,所以没有进行驼峰式命名的转换。 最后编写客户端程序: ```java package com.eureka.client.eurekaclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } } ``` 运行后继续查看服务端页面`http://localhost:8888`: ![eureka-register.png](https://0o0.me/usr/uploads/2018/07/300650166.png) 可以看到服务注册成功! 文章篇幅略长,服务消费后面再写文章去了。。主要两种消费方式:RestTemplate(和自己手写 http 调用差不多)、Feign 声明式调用(这种就和调接口差不多了)。 标签: 无