在找. net core 微服务框架时发现了 Steeltoe 开源项目, 它可以基于 Spring Cloud 实现. net core 和. net Framework 的微服务. 正好之前也有学习过 SpringBoot, 而 Spring Cloud 是基于 SpringBoot 的, 有了 SpringBoot 基础上手入门 SpringCloud 应该也不难, 正好我的第一本书 <<Spring 快速入门>> 即将上架, 感兴趣的朋友可以多多支持. 本篇主要学习服务注册与发现组件 Eureka.
在学习之前首先聊一聊为什么会有微服务, 它的优缺点是什么.
在微服务之前主要是单体应用, 单体应用常见的就是一个 war 文件包含所有功能的应用程序包, 每次迭代更新哪怕是更新一行代码都需要重新打包部署, 同样每次迭代可能都要进行测试, 模块与模块之间耦合度也比较高, 导致可能需要对整个 war 包进行的测试, 如果出现一个 bug 导致内存溢出, 死循环, 可能导致整个应用崩溃. 二八原则在日常生活中普遍存在, 在软件领域也一样, 我们平时浏览网页一般读的多, 写的少, 例如逛博客园, 我们可能浏览的比较多, 提交数据的频率比较少, 在单体应用中如果要增加浏览接口的部署, 同样也会将提交数据的接口部署上去会造成资源浪费, 单体应用往往使用统一的技术平台或方案解决所有的问题, 开发语言和框架固定之后后续想引入新框架和技术也比较困难.
在单体应用中主要是面对单个应用的编程, 而在微服务中主要是面对单个功能点的编程, 将提供的功能点对外发布, 这样其他地方可以不用关心具体用什么语言什么技术实现的, 直接调用即可. 而且每个功能点可以独立部署, 是解耦的. 假如某个接口调用增多, 可以单独部署该接口应用, 扩展性比较好. 某个节点出现故障可以迅速让其他节点顶上, 不至于整个应用不可用, 容错性好, 某个服务访问超出服务器承载时也可以进行限流, 后续的 CI,CD 容器化也比较方便. 同样有优点也有缺点, 微服务会导致对外提供的接口增多, 部署数量增多, 服务治理带来新的挑战, A 服务会调用 B 服务, B 服务会调用 C 服务, 如果 A 服务报错了, 那是 A 服务导致的还是 B,C 服务导致的呢, 而且对外提供服务的节点可能会有很多, 那是哪个服务的哪个节点导致的呢? 所以还需要微服务的链路追踪与排查. 前面也提到微服务方便扩展, 那什么情况下需要扩展, 哪些服务节点需要扩展, 这需要用数据说话, 那就需要对服务进行监控, 而且监控的参数指标和维度也是不一样的.
前面算是导语, 下面切回正题, 来学习服务注册与发现组件 Eureka. 每个站点都对外提供某些服务, 有点类似家里赶集一样, 有的卖家说卖衣服的, 提供卖衣服的接口, 有的卖家是卖拖拉机的, 提供卖拖拉机的接口, 每个卖家都是独立分散的, 假如每个卖家都不在一个集市上, 那买家可能需要先找到每个卖家住在什么地方, 哪个村的叫什么名字, 一般逛一家可能还没选到合适的, 还要多逛几家, 这样买家就要来回跑, 那有了集市之后就不一样了, 每个卖家都在集市上提供不同的服务, 买家只要到固定的集市上找需要的服务即可, 就和在没出现淘宝之前买东西需要到实体商店, 有了淘宝之后只要输入淘宝网址就能找到不同商家提供的不同服务. Eureka 就是有点类似淘宝的功能, 它为服务提供者 (卖家) 提供了一个集中的平台, 只要注册一下说明提供什么服务, 服务消费者 (买家) 不用关心服务提供者在什么地方, 直接调用就好了, 是一个中心化的过程.
一, 创建 Eureka Server
1. 引入依赖
SpringCloud 使用 Eureka 也比较容易, 创建 SpringBoot 项目时选中 Eureka Server 即可, 它会在 pom.xml 中自动引入下面两个依赖, 也可以自己添加.
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter</artifactId>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- </dependency>
- View Code
2, 启动代码中添加 @EnableEurekaServer 注解
- package com.example.demo;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
- @EnableEurekaServer
- @SpringBootApplication
- public class EurekaServerApplication {
- public static void main(String[] args) {
- SpringApplication.run(EurekaServerApplication.class, args);
- }
- }
- View Code
3, 配置文件
在默认设置下, 该服务注册中心也会将自己作为客户端来尝试注册它自己, 所以我们需要禁用它的客户端注册行为, 在 application.properties 添加以下配置:
- spring.application.name=spring-cloud-eureka
- eureka.client.register-with-eureka=false
- eureka.client.fetch-registry=false
- eureka.client.serviceUrl.defaultZone=http://localhost:${
- server.port
- }/eureka/
- server.port=8088
eureka.client.register-with-eureka : 表示是否将自己注册到 Eureka Server, 默认为 true.
eureka.client.fetch-registry : 表示是否从 Eureka Server 获取注册信息, 默认为 true.
eureka.client.serviceUrl.defaultZone : 设置与 Eureka Server 交互的地址, 查询服务和注册服务都需要依赖这个地址. 默认是 http://localhost:8761/eureka ; 多个地址可使用 , 分隔.
4. 启动应用
在浏览器输入 http://localhost:8088/ , 即可看到下面页面, 暂时还未有注册的实例.
二, Eureka 集群
这里使用两个节点来构建 Eureka 注册中心, 首先添加两个配置文件 application-peer1.properties,application-peer2.properties. 分别启动了 8000,8001 端口. 同时
eureka.client.serviceUrl.defaultZone 为对方的地址.
- application-peer1.properties:
- spring.application.name=spring-cloud-eureka
- server.port=8000
- eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
- application-peer2.properties:
- spring.application.name=spring-cloud-eureka
- server.port=8001
- eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
- application.properties:
- spring.application.name=spring-cloud-eureka
- eureka.client.register-with-eureka=false
- eureka.client.fetch-registry=false
将 Eureka Server 项目打包, mvn clean package, 会生成 EurekaServer-0.0.1-SNAPSHOT.jar 包.
在 EurekaServer-0.0.1-SNAPSHOT.jar 的目录下, 分别执行下面两句命令, 启动两个 EurekaServer 实例.
- java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
- java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
然后在浏览器中输入 http://localhost:8001/ 和 http://localhost:8000/ 就会发现你中有我我中有你. 这里也都是参考纯洁的微笑大神的: http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html. 在里面介绍说注册中心会出现在 available-replicas 中, 但我这边的测试并未在 available-replicas 中, 看它的评论里也有一些也是未出现在 available-replicas 中, 这个地方可能还要再留意一下.
三, 创建 Eureka Client
1, 引入依赖
这里先创建个服务提供者, 也就是生产者. 在创建时选中 Eureka Client, 项目会自动引入下面的 spring-cloud-starter-netflix-eureka-client 依赖. 由于要提供服务, 所以这里又引入了 spring-boot-starter-web.
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
- </dependency>
2, 启动代码中添加 @EnableDiscoveryClient 注解
与上面添加 @EnableEurekaServer 类似, 这里添加 @EnableDiscoveryClient 注解.
3. 配置文件
这里提供配置了 eureka 交互地址, 这里为两个, 将服务注册到 eureka 两个实例中.
- spring.application.name=spring-cloud-producer
- server.port=9000
- eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/,http://localhost:8001/eureka/
4. 增加服务 HelloController
- package com.example.demo;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RequestParam;
- import org.springframework.Web.bind.annotation.RestController;
- @RestController
- public class HelloController {
- @RequestMapping("/hello")
- public String index(@RequestParam String name) {
- return "hello"+name+",this is first messge";
- }
- }
- View Code
5. 启动应用就可在 http://localhost:8000/ 和 http://localhost:8001/ 中看到最近注册到 Eureka 的实例 spring-cloud-producer.
四, 小结
本篇主要了解了下什么是 Eureka, 它的作用, 以及如何使用. 主要学习 Eureka 服务端的配置和双节点配置, 将 Eureka client 注册到 Eureka server 中, 后续就是要学习如何调用生产者提供的服务了.
最后再推荐下我的新书<<spring 快速入门>>, 个人认为对与 Spring 初学者来说还是值得一读的, 虽然之前也没有过 Java 的工作经验, 写这本书的过程也是我二次复习巩固 Spring 的过程, 我也是以初学者的角度来完成这本书的. 本书目录在前面的博客中, 可以点击查看.
来源: https://www.cnblogs.com/5ishare/p/11111621.html