springcloud(三)-Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。
服务发现简介
服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。
有了服务中心调用关系会有什么变化?
上一节我们见识了springcloud最简单的微服务调用。类似于
项目A调用项目B
正常调用项目A请求项目B
有了服务发现Eureka机制,任何一个服务都不能直接去掉用,都需要通过服务中心来调用
如果是项目A调用项目B,项目B在调用项目C
这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。
这样做有什么好处呢?如果只有这样一两个服务,而且访问量不大的情况下,这样做确实有点画蛇添足的感觉。但是,如果像这样的服务由二三十个,上百个呢?画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。
由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。
Eureka 简介
Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
用一张图来认识以下:
上图简要描述了Eureka的基本架构,由3个角色组成:
1、Eureka Server
- 提供服务注册和发现
2、Service Provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
3、Service Consumer
- 服务消费方
- 从Eureka获取注册服务列表,从而能够消费服务
编写Eureka Server
spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。
1.创建一个maven工程,pom.xml文件添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.itmuch.cloud</groupId> 6 <artifactId>microservice-discovery-eureka</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>microservice-discovery-eureka</name> 11 <url>http://maven.apache.org</url> 12 13 <parent> 14 <groupId>org.springframework.boot</groupId> 15 <artifactId>spring-boot-starter-parent</artifactId> 16 <version>1.5.9.RELEASE</version> 17 </parent> 18 19 <properties> 20 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 21 <java.version>1.8</java.version> 22 </properties> 23 24 <dependencies> 25 <dependency> 26 <groupId>org.springframework.boot</groupId> 27 <artifactId>spring-boot-starter-web</artifactId> 28 </dependency> 29 <!-- 用于监控spring boot 端点 --> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-actuator</artifactId> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework.boot</groupId> 36 <artifactId>spring-boot-starter-tomcat</artifactId> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-devtools</artifactId> 41 <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --> 42 </dependency> 43 <dependency> 44 <groupId>org.springframework.cloud</groupId> 45 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> 46 </dependency> 47 </dependencies> 48 49 <!-- 引入spring cloud 的依赖 --> 50 <dependencyManagement> 51 <dependencies> 52 <dependency> 53 <groupId>org.springframework.cloud</groupId> 54 <artifactId>spring-cloud-dependencies</artifactId> 55 <version>Edgware.RELEASE</version> 56 <type>pom</type> 57 <scope>import</scope> 58 </dependency> 59 </dependencies> 60 </dependencyManagement> 61 62 <!-- 添加spring-boot 的maven插件 --> 63 <build> 64 <plugins> 65 <plugin> 66 <groupId>org.springframework.boot</groupId> 67 <artifactId>spring-boot-maven-plugin</artifactId> 68 </plugin> 69 </plugins> 70 </build> 71 </project>
2.编写启动类,添加@EnableEurekaServer注解,声明这是一个Eureka Server
package com.itmuch.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
3.配置文件application.yml
server: port: 8083 eureka: client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://localhost:8083/eureka
简单介绍一下:
- eureka.client.registerWithEureka:表示是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而这里设为false。
- eureka.client.fetchRegistry:表示是否从Eureka Server获取注册信息。默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,所以设为false
- eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8083/eureka;多个地址间可使用“,”分隔。
这样一个Eureka Server就编写完了。
测试
启动Eureka Server 启动类。访问 http://localhost:8083/,可以打开界面
目前没有任务服务注册到上面。
将微服务注册到Eureka Server上
改写上一节的microservice-simple-provider-user
1.pom.xml文件添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2.配置application.yml
server: port: 8084 eureka: client: serviceUrl: defaultZone: http://localhost:8083/eureka/ instance: prefer-ip-address: true spring: application: name: microservice-provider-user jpa: generate-ddl: false show-sql: true database-platform: org.hibernate.dialect.MySQL5Dialect hibernate: ddl-auto: none datasource: url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8 username: root password: 1234 driver-class-name: com.mysql.jdbc.Driver http: multipart: maxFileSize: 100Mb maxRequestSize: 100Mb logging: level: root: INFO org.hibernate: INFO org.hibernate.type.descriptor.sql.BasicBinder: TRACE org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
其中,spring.application.name用于指定注册到Eureka Server上的应用名称;eureka.instance.prefer-ip-address = true 表示将自己的IP注册到Eureka Server。若不配置该属性或将其设置为false,则表示注册微服务所在操作系统的hostname到Eureka Server 。
另外,同样的操作,给microservice-consumer-movie也来一遍。
测试
启动 microservice-discovery-eureka
启动 microservice-provider-user
启动 microservice-consumer-movie
注:因为每一个服务在启动的时候都会注册到服务发现上面去,如果eureka没开的话,服务在启动的时候会报找不到服务发现的错误,所以一般都是先开eureka。但是就算你后启动eureka,每一个服务客户端都会在eureka启动之后,再连到上面去,不会影响使用。
访问http://localhost:8083/,可看到页面
由此图可知,我们的两个微服务客户端已经被注册到Eureka Server 上了。
我们访问http://localhost:8082/user/1,得到结果
{"id":1,"username":"account1","name":"张三","age":20,"balance":98.23}
由此可知,movie服务通过Eureka Server 找到 user 服务,访问获得了结果。
OK!完美!
这一节没多少新代码,该有的都再上面贴出来了。源码就不放了。