Spring Cloud 微服务实战系列-Eureka注册中心(一)
导语
在这一个系列的分享中,笔者主要是来分享在实战实际操作中的一些使用场景,了解了实战的操作中的使用场景才能更好的从实战中的问题出发找到自己需要的原理性的东西,找到原理性的东西之后才可以更好的根据原理性的东西进行内容上的扩展不断的提升自己的能力,实现从零到一的突破。
文章目录
- Eureka介绍
- 使用Eureka搭建服务注册中心
- 创建一个Maven项目
- 创建启动类
- 配置文件
- 编写服务提供者
- 创建Maven项目
- 编写启动类
- 编写配置文件
- 启动服务提供者
- 编写服务消费者
- 直接调用上面接口
- 启动类
- 总结
注册中心在微服务架构中是不可或缺的一个部分,主要用来实现服务治理的功能,当然在实际的开发中有很多实现服务治理功能的技术实现。这里主要说的是Spring Cloud 系列中的Eureka组件,Eureka是由Netflix提供的,被Spring Boot整合之后用来在SpringCloud中提供服务注册服务治理的功能。
Eureka介绍
Spring Cloud Eureka是Spring Cloud Netflix 微服务组件的一部分,是基于Netflix的Eureka整合的Spring Boot的二次封装,将很多的配置性的东西都进行了自动化封装,主要提供了在Spring Cloud 微服务技术栈中的服务治理的功能。Spring Cloud Eureka 是提供了REST的服务,并且因为是整合Spring框架,所以在客户端语言上对Java语言也是比较友好的。
对于服务治理来说在微服务中服务治理是必不可少的一块内容,在之前的博客中也对微服务服务治理相关的内容进行过分享这里简单的做个说明,在服务治理方面国内的主要就是阿里系的Dubbo比较火热,很多的互联网公司都是对标阿里。在很多的中小型公司里更多的使用的Spring Cloud全家桶。当然除了这些之外还有其他的一些技术例如Consul、Etcd、Zookeeper等等来作为服务注册中心。
对Dubbo有一定了解的人可能都知道在Dubbo中提供了两种主要的注册中心服务,一种是基于Zookeeper的服务注册中心,另一种是基于Redis的服务注册中心。至于在具体的开发中使用那种服务注册中心要根据实际的服务器需求以及实际的开发场景进行选择,毕竟在技术选型上适合别人的未必就是适合自己的。
在比较简单的服务场景下例如A服务调用B服务,我们维护了一套调用关系表,如果调用关系发生变化的时候我们可以通过手动的方式进行调用关系表的修改,但是如果在微服务场景下会出现很多的微服务,他们之间的相互调用关系以及接口的维护等对于开发者来说就比较麻烦了,而服务注册中心提供的就是一个公共的调用关系表。服务提供者不需要知道有多少调用方,调用方也不需要知道有多少服务提供者,只需要知道在服务注册中心能找到自己想要的服务即可。
这里笔者说一个 个人观点,为什么在一定的场景下Eureka比Zookeeper更加适合作为服务注册中心呢,是因为对于一个分布式系统存储来说要满足CAP原则,其中C表示一致性,A表示可用性,P表示分区容错性。Eureka是基于AP原则进行创建的,而Zookeeper是基于CP原则创建的。试想对于一个服务注册中心来说是一致性更重要还是可用性更重要,在有些场景中来说可能可用性比一致性更重要一些。所以说Eureka比Zookeeper更适合一点。对于Zookeeper来说,Zookeeper有一个leader,并且这个leader是通过Paxos算法选举出来的一个,这个Leader存在的意义就是可以在Leader节点写入,其他节点进行实时同步。保证了一致性。所以在要有一致性比较高的场景中使用Zookeeper作为注册中心就比较合适了
使用Eureka搭建服务注册中心
创建一个Maven项目
首先需要创建一个Maven项目,在pom.xml文件中配置Eureka所要使用的相关依赖
<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><!--<version>2.0.6.RELEASE</version>--><version>2.1.1.RELEASE</version><relativePath/></parent><groupId>com.nihui.eureka</groupId><artifactId>base-eureka</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId><version>2.1.1.RELEASE</version></dependency><!-- 健康检查 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
创建启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplicaiton {public static void main(String[] args) {SpringApplication.run(EurekaApplicaiton.class,args);}
}
这个跟SpringBoot的启动类看上去没有什么太大的区别,只是多了一个@EnableEurekaServer注解,表示开启Eureka的服务。
配置文件
server: port: 8082spring: application: name: eureka-servereureka: server:# 是否允许开启自我保护模式,缺省:true# 当Eureka服务器在短时间内丢失过多客户端时,自我保护模式可使服务端不再删除失去连接的客户端enableSelfPreservation: false# Eureka服务器清理无效节点的时间间隔,单位:毫秒,缺省:60000,即60秒evictionIntervalTimerInMs: 5000# Peer节点更新间隔,单位:毫秒peer-eureka-nodes-update-interval-ms: 10instance:preferIpAddress: true# 服务续约(心跳)频率,单位:秒,缺省30leaseRenewalIntervalInSeconds: 10# 服务失效时间,失效的服务将被剔除。单位:秒,默认:90leaseExpirationDurationInSeconds: 30# 健康检查页面的URL,相对路径,默认使用 HTTP 访问,如需使用 HTTPS则要使用绝对路径配置,缺省:/healthhealthCheckUrlPath: ${management.endpoints.web.basePath}/health# 状态页面的URL,相对路径,默认使用 HTTP 访问,如需使用 HTTPS则要使用绝对路径配置,缺省:/infostatusPageUrlPath: ${management.endpoints.web.basePath}/infometadataMap: cluster: MIDDLEWARE management.context-path: ${management.endpoints.web.basePath}client:enabled: trueeurekaServiceUrlPollIntervalSeconds: 300# 从Eureka客户端到所有Eureka服务端的连接总数,缺省:200eurekaServerTotalConnections: 30# 从Eureka客户端到每个Eureka服务主机的连接总数,缺省:50eurekaServerTotalConnectionsPerHost: 10# 是否从Eureka获取注册信息,缺省:true# 一般情况下,Eureka服务端是不需要的fetchRegistry: true# 是否向注册中心注册自己,缺省:true# 一般情况下,Eureka服务端是不需要再注册自己的registerWithEureka: true availabilityZones:defaultRegion: defaultZone region: defaultRegion# 是否启用客户端健康检查healthcheck:enabled: true# Eureka服务器的地址,类型为HashMap,缺省的Key为 defaultZone;缺省的Value为 http://localhost:8761/eureka# 如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。serviceUrl:
# defaultZone: http://10.115.3.1:8080/eureka/,http://10.115.3.2:8080/eureka/defaultZone: http://127.0.0.1:8082/eureka/# 客户端拉取服务注册信息间隔,单位:秒,缺省:30registry-fetch-interval-seconds: 30management: server:port: 8081endpoints: enabled-by-default: falseweb: basePath: /mgmtexposure:include: "*"endpoint:health:enabled: trueshowDetails: ALWAYSinfo:enabled: trueenv:enabled: truepost:enabled: truelogfile:enabled: trueloggers:enabled: truemappings:enabled: truebeans:enabled: truehttptrace:enabled: truethreaddump: enabled: trueheapdump:enabled: truemetrics:enabled: true
这里一定记住一点,在配置的中 下面这个配置一定要配置成false。不然在启动Eureka的服务的时候会把自己当做客户端进行注入。
eureka: client:# 是否向注册中心注册自己,缺省:true# 一般情况下,Eureka服务端是不需要再注册自己的registerWithEureka: true
完成上面的配置之后就是启动项目看看效果,上面我们配置的端口是8082启动之后就在8082端口进行访问
编写服务提供者
创建Maven项目
创建maven项目在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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.1.RELEASE</version></parent><groupId>com.nihui.springcloud.provider</groupId><artifactId>base_provider</artifactId><version>1.0-SNAPSHOT</version><dependencies><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><version>2.1.1.RELEASE</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
编写启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class,args);}
}
启动类与之前没有太大的区别,只是将注解换成了@EnableDiscoveryClient,表示当前服务作为Eureka客户端进行启动。
编写配置文件
spring.application.name=eureka-client-user-service
server.port=8083
eureka.client.service-url.defalutZone=http://localhost:8082/eureka/
#采用IP注册
eureka.instance.prefer-ip-address=true
# 定义实例ID格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
启动服务提供者
@RestController
public class UserController {@GetMapping("/user/hello")public String userHell(){return "User Hello";}
}
编写服务消费者
直接调用上面接口
和上面的创建方式一样,配置文件如下
<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.1.RELEASE</version></parent><groupId>com.nihui.springcloud.consumer</groupId><artifactId>base_consumer</artifactId><version>1.0-SNAPSHOT</version><dependencies><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><version>2.1.1.RELEASE</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR2</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
spring.application.name=eureka-client-article-service
server.port=8084eureka.client.service-url.defalutZone=http://localhost:8082/eureka/#采用IP注册
eureka.instance.prefer-ip-address=true# 定义实例ID格式eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
这里做一个简单的说明,博主在之前大厂面试的过程中被问到Spring请求调用方式,博主当博主回答到RestTemplate的时候面试官一脸懵,博主当时不知道是自己回答的不对还是面试官不知道。对于RestTemplate来说它是Spring提供的用于访问REST服务的客户端,类似于JDBCTemplate一样,RestTemplate提供了多种访问远程HTTP服务的方法,能够在一定程度上提升客户端的编写效率,但是与JDBCTemplate一样也需要进行配置,如下
@Configuration
public class BeanConfigration {@Bean@LoadBalancedRestTemplate restTemplate(){return new RestTemplate();}
}
很简单的配置,当然也支持其他配置,这个后续在研究。这里需要注意的一点就是 @LoadBalanced,负载均衡,这个会在后续的内容上做分享。
编写好之后就开始编写消费者的Controller,如下
@RestController
public class ArticleController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/sayHello1")public String sayHello1(){// return restTemplate.getForObject("http://localhost:8081/user/hello",String.class);
// return restTemplate.getForObject("http://10.2.121.14:8081/user/hello",String.class);return restTemplate.getForObject("http://eureka-client-user-service/user/hello",String.class);}@GetMapping("/sayHello2")public String sayHello2(){return restTemplate.getForObject("http://eureka-client-user-service/user/hello",String.class);}}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class,args);}
}
&emps;准备工作完成之后就可以启动项目进行测试了,在测试过程中出现的问题然后再去解决问题,从这个过程中不断的理解其中的原理。
总结
在启动之后,在注册中心会看到如下的内容
这个时候服务提供者和服务消费者都被注册到其中。接下来就是试试调用是否成功,在服务消费者的8084端口上调用对应的服务
会看到返回的内容就是在消息提供者中编写的内容,到此我们整个的注册中心服务消费者,服务提供者就已经搭建完成了。当然有兴趣的可以沿着这个项目思路继续进行搭建,然后形成自己独有的微服务体系。
Spring Cloud 微服务实战系列-Eureka注册中心(一)相关推荐
- Spring Cloud 微服务实战系列-Eureka注册中心(二)
导语 之前的分享中,简单的介绍了SpringBoot的入门知识以及如何使用Eureka搭建服务注册中心,这一次的分享主要是来讲解一些在Eureka中的常用的配置,方便大家在使用Eureka的时候可 ...
- Spring Cloud 微服务实战系列-Spring Boot再次入门(一)
导语 看到标题大家都疑惑,为什么叫做再入门呢?在之前的博客中也分享过相关的内容,但为了让Spring Cloud 微服务实战系列更加完整就再次编写一个入门的内容,也是为了这个系列的内容更加的完整, ...
- Spring Cloud 微服务实战系列-Ribbon整合RestTemplate实现负载均衡
导语 在Spring Cloud项目中想要整合Ribbon只需要在pom文件中加入对应的依赖就可以了,那么在这次的分享中就来看看在Ribbon怎么通过RestTemplate来进行负载均衡,以及扩 ...
- Spring Cloud 微服务实战系列-Ribbon入门RestTemplate 介绍
导语 目前在开发中主要的负载均衡方案分为两种:一种是集中式的负载均衡,在生产者和消费者之间通过F5或者是Nginx来进行负载均衡,而另一种则是在客户端自己进行负载均衡,也就是说请求客户端可以根据自 ...
- Spring Cloud 微服务实战系列-Spring Boot再次入门(二)
导语 在之前的一篇中简单的介绍一些在SpringBoot中常见的使用方式,已经如何实现自定义的一些配置,设置等等的内容,这一次的分享中来介绍一些在Spring Boot 中的高级用法,这样会对Sp ...
- 手把手,嘴对嘴教你Spring Cloud 微服务实战 -- 前言
Spring Cloud 总结 博主接触到Spring Cloud 大概已经一年多了,当时Spring Cloud微服务框架已经是潮流了,不会一点都不好意思出去面试.并且主流技术基本上都在谈论微服务, ...
- Spring Cloud 微服务实战笔记
Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...
- Spring Cloud 微服务实战精品文章大汇总,错过了血亏!
随着互联网的高速发展,庞大的用户群体和快速的需求变化已经成为了传统架构的痛点.在这种情况下,如何从系统架构的角度出发,构建出灵活.易扩展的系统来快速响应需求的变化,同时,随着用户量的增加,如何保证系统 ...
- Spring Cloud微服务实战(五)-应用通信
订单服务源码 https://github.com/Wasabi1234/SpringCloud_OrderDemo 商品服务源码 https://github.com/Wasabi1234/Spri ...
最新文章
- Java ResultSet如何检查是否有任何结果
- 2021-01-22 使用 Docker 打包 Python 项目
- How to Register COM in VS
- 蓝桥杯-组素数-java
- linux如何启动wifi,【教程】Wii安装运行可用WIFI的Linux系统全攻略
- python 即时通讯_用python实现发送即时消息到twitter
- Qt 遍历目录下所有图片
- 今天看C++Primer发现的问题
- 基于ARM的嵌入式Linux应用程序开发
- PHP excel导出 表格 ,带图片
- 显示硬件发展与视频开发系列(6)----显示标注与视频处理单元(4):GPGPU
- flink Too many fields referenced from an atomic type
- 小程序下拉刷新没有响应
- 团队项目-团队成员介绍
- Pr 仿漫威片头效果~
- js如何简单实现汉字转成拼音的功能
- Android 端处理 YUV 数据 - Libyuv 的编译与使用
- Git——git的简单使用以及连接gitee的远程仓库[经验 y.2]
- Java FX 表格数据赋值
- Python编程知识点总结
热门文章
- django linux 有时候获取时间不对,关于Django显示时间你应该知道的一些问题
- Kooteam 0.2.0 发布,新增周报、日报功能
- [Leetcode]字符串转换整数 (ATOI)
- 澳网:公茂鑫/张择创历史 中国男网夺大满贯首胜
- LINUX系统服务总结之三:nis服务器全集
- 傲腾明年爆发 Intel霸占企业市场,成SSD真正赢家
- Whats the difference between git reset --mixed, --soft, and --hard?
- 与时间相关NSCalendar、NSDate类的基本使用
- 【转载】stackoverflow 上关于 rebar 的讨论
- c#中Split分割字符串的几种方法