一, Eurake 的简介
二, 使用 Eureka 进行服务的注册消费
1, 创建一个服务注册中心
2, 创建服务的提供者
3, 创建服务的消费者
总结
一, Eurake 的简介
今天我们来介绍下 springcloud 的核心组件 Eureka,Eurake 是负责微服务架构中服务治理的功能, 负责各个服务实例的注册与发现.
Eureka 包含了服务器端和客户端组件. 服务器端, 也被称作是服务注册中心, 用于提供服务的注册与发现. 客户端组件包含服务消费者与服务生产者. 在应用程序运行时, 服务生产者向注册中心注册自己的服务实例, 当消费者需要调用这个服务时, 会先从注册中心去查找对应的生产者, 然后就可以实现对该服务的消费了.
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
上图是一个较为简单的服务注册消费过程, 也是 Eureka 组件的一个基本运转流程. 下面我们来搭建一个 Eureka 实例.
二, 使用 Eureka 进行服务的注册消费
1, 创建一个服务注册中心
首先, 打开 intellij idea, 创建一个 springboot 项目的主 Maven 工程, 名称是 eureka, 勾选上需要用到的依赖, 提醒一下, 笔者这里选择的 springboot 版本是 2.0.3, 建议读者们也选择同样的版本.
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
点击下一步后, 填写上项目名并点击完成即可.
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
这样, 主工程就创建成功了, 创建完主工程后, 我们需要创建两个子工程, 一个是服务注册中心 eureka-server, 另一个作为客户端, 我们命名为 eureka-client.
下面, 我们先创建 server 的例子, 右键主工程, 选择 New -> model -> spring initialir 创建一个新 module,
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
点击下一步, 填完信息后跳转到选择依赖的界面, 选择 Eureka Server 依赖
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
创建后的 pom 文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> http://maven.apache.org/xsd/maven-4.0.0.xsd ;
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.yeya</groupId>
- <artifactId>demo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>eureka</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.3.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
要想开启服务注册中心, 我们需要在 springboot 项目中的 main 入口文件添加 @EnableEurekaServer 注解
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
默认情况下, Eureka server 会自己向自己注册, 我们需要在配置文件 application.yml 添加一些配置, 代码如下:
- # 端口
- server:
- port: 8761
- eureka:
- instance:
- hostname: localhost
- client:
- registerWithEureka: false
- fetchRegistry: false
- serviceUrl:
- defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ http://${eureka.instance.hostname}:${server.port}/eureka/
设置服务的端口为 1111, 同时, 通过设置 eureka.client.register-with-eureka 和 eureka.client.fetch-registry 都为 false 即可关闭服务向自己注册.
完成这一切后, 我们右键 main 方法启动项目, 然后再浏览器中访问地址
http://localhost:1111, 结果如下图 http://localhost:1111,结果如下图/ :
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
这是 eureka 注册中心的界面图, 我们可以看到很多信息, 比如 "System Status" 可以看到我们的环境以及系统时间等信息, 以及 "General Info" 里有很多关于注册中心的常规信息, 包括了 cpu, 可用空间等, 这些知识点比较多, 而且不影响我们的项目效果, 所以笔者今天不打算讨论太多, 看改天有空再写一篇博文来为大家专门介绍, 我们要关注的是 "Instances currently registered with Eureka" 这一栏, 栏中显示 No instances available , 很明显, 因为我们没有注册服务, 也就没有可用的服务, 所以, 我们要再创建客户端项目 eureka-client.
2, 创建服务的提供者
eureka-client 的创建过程同 server 类似, 在选择依赖时换成 Eureka Discovery, 创建后的 pom 文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> http://maven.apache.org/xsd/maven-4.0.0.xsd ;
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.yeya</groupId>
- <artifactId>eureka</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>eureka</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.3.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
同样, 我们需要在 main 加上注解 @EnableDiscoveryClient
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
然后, 在 eureka-client 的配置文件中加入以下配置:
设置服务名
- spring:
- application:
- name: eureka-client
设置注册中心地址
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:1111/eureka
首先, 指明自己的服务名为 eureka-client, 同时, 指明注册中心的地址, 这样, 注册中心才能找到这个服务.
这里要说明一下, idea 的配置文件是可以自动提示的, 但是写注册中心地址时只能提示到 service-url, 之后的 defaultZone 是需要读者自己编写的, 有人会怀疑是不是我写错了, 其实不是, 我们可以按 ctrl 点击 defaultZone 跳转到它的 bean 类查看源码.
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
可以看到, 这里的默认标识的确是 "defaultZone", 所以配置文件这么写是没有问题的, 大家如果对配置的解析过程有兴趣的话, 可以自己一步步跟着源码查看.
配置完之后, 启动 eureka-client 项目, 然后返回 eureka-server 的访问界面, 可以看到我们的服务注册成功了!
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
这样, 我们的服务注册就完成了, 接下来我们来测试一下服务消费的过程.
3, 创建服务的消费者
接下来, 我们创建一个服务消费者的工程, 命名为 eureka-consumer, 创建过程同 eureka-client 一样, 创建成功后在 main 入口文件加入注解 @EnableDiscoveryClient, 然后修改一下配置文件 application.yml:
设置服务名
- spring:
- application:
- name: eureka-consumer
设置注册中心地址
- eureka:
- client:
- service-url:
- defaultZone: http://localhost:1111/eureka
- server:
- port: 1113
为了能测试服务消费的效果, 我们先在 eureka-client 中的主类中创建一个接口 dc,
- @EnableDiscoveryClient
- @SpringBootApplication
- @RestController
- public class EurekaApplication {
- public static void main(String[] args) {
- SpringApplication.run(EurekaApplication.class, args);
- }
- @GetMapping("/hello")
- public String dc() {
- return "hello";
- }
- }
在 eureka-consumer 的应用主类中, 初始化 RestTemplate , 用来真正发起 REST 请求.
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
在这里, 我们稍微介绍一下 RestTemplate ,RestTemplate 是用来访问 restful API 的网络框架, 其主要方法与 rest 的 http 协议相关, 例如 GET ,POST ,PUT ,DELETE, 这些方法对应这个类中的 getForObject(),getForEntity(),postForObject(),put()和 delete()等, 本文里我们用 getForObject()来请求 API 并返回对应的信息.
新建一个 controller 文件, 添加一个接口("/consumer"), 用来消费 eureka-client 提供的接口 :
- @RestController
- public class ConsumeController {
- @Autowired
- private LoadBalancerClient client;
- @Autowired
- RestTemplate restTemplate;
- @GetMapping("/consumer")
- public String consumer() {
- ServiceInstance serviceInstance = client.choose("eureka-client");
- String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/hello";
- String dc = restTemplate.getForObject(url,String.class);
- return dc;
- }
- }
先通过 @Autowired 注入 LoadBalancerClient 一个实例 client,client.choose()的参数是需要调用到的服务的名称, 传入之后即可创建一个服务实例, 通过实例的方法调用就可以访问到 eureka-client 的 "hello" 接口并返回字符串信息. 分别启动 eureka-server,eureke-client,eureka-consumer 三个工程, 在浏览器访问 http://localhost:1111/, 从下图中可以看到两个服务都已经注册成功
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
接着, 打开新页面访问 http://localhost:1113/consumer, 可以看到浏览器成功输出 "hello" 字符串.
springcloud 微服务系列教程 (二) 服务注册与发现组件 Eureka
这表明, 我们成功通过 eureka-consumer 提供的接口来消费了 eureka-client 这个微服务了.
总结
本文给大家简单介绍了服务注册发现组件 eureka 的实例, 同时也实现了服务之间的调用, 虽然例子简单, 但也算开了个好头, 接下来的系列教程会继续为大家讲解其他组件的用法, 欢迎读者们能跟我一起学习, 如若文章有错误或不足之处, 读者们可以在评论区指出, 我会积极给于回复!
来源: http://blog.51cto.com/13792737/2159217