spring cloud Eureka
1.
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-eureka-server</artifactId>
- </dependency>
–
- server:
- port: 7001
- eureka:
- instance:
- hostname: localhost
- client:
- register-with-eureka: false #false表示不向注册中心注册自己
- fetch-registry: false #false表示自己就是注册中心,职责是维护实例,不参加检索
- service-url:
- defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置eureka server的交互地址,即对外暴露的地址
–
-
==注意:要在类前加@EnableEurekaServer注解==
-
- 1 package com.XXX;
- 2
- 3 import org.springframework.boot.SpringApplication;
- 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
- 5 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
- 6
- 7 @SpringBootApplication
- 8 @EnableEurekaServer
- 9 public class Eureka7001_APP {
- 10 public static void main(String[] args) {
- 11 SpringApplication.run(Eureka7001_APP.class,args);
- 12 }
- 13 }
启动主程序,访问该服务地址即可
- 1 <dependency>
- 2 <groupId>org.springframework.cloud</groupId>
- 3 <artifactId>spring-cloud-starter-eureka</artifactId>
- 4 </dependency>
- 5 <dependency>
- 6 <groupId>org.springframework.cloud</groupId>
- 7 <artifactId>spring-cloud-starter-config</artifactId>
- 8 </dependency>
2.修改yml
-
-
==理解:小区用户要找到物业管理处的地址进行注册==
- 1 eureka:
- 2 client:
- 3 service-url:
- 4 defaultZone: http://localhost:7001/eureka
3.
-
- 1 @SpringBootApplication
- 2 @EnableEurekaClient//注表名自己是注册方,将服务注入eureka
- 3 public class Provider8001_APP { public static void main(String[] args) { SpringApplication.run(Provider8001_APP.class,args);
}
}
-
启动成功
-
主机名称与服务名称的修改
- 修改服务名称,在yml中eureka节点下添加如下内容
-
- eureka:
- instance:
- instance-id: dept8001 #修改别名
- prefer-ip-address: true #显示IP地址
- <!--热部署依赖,可以添加到父工程中,每一个工程都可以使用-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>springloaded</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- </dependency>
完善点击up
里面的内容会出现微服务描述(info内容构建)
-
在查看Eureka时点击进入某个微服务的info时,能给查看者一些必要的信息,可以帮助查看者快速的了解该微服务,开发中十分有意义。
修改方法
-
==当前工程==添加依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
-
==总的父工程==的build节点下添加如下内容
- <build>
- <finalName>microservicecloud</finalName>
- <resources>
- <resource>
- <!--允许扫描该路径下的资源文件-->
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <configuration>
- <delimiters>
- <!--指定动态获取以$标志开头结尾的信息-->
- <delimit>$</delimit>
- </delimiters>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
在==当前工程== 的application.yml文件添加回显信息
- info:
- author: XXX
- build-version: $project.version$
介绍
Eureka的自我保护机制主要是为了网络异常时保持高可用设计的,当在Eureka中注册的微服务超过设定是时间内(默认90秒)没有向Eureka服务端发送心跳,该微服务会进入自我保护模式。在自我保护模式中,Eureka会保护服务注册表中的信息,不会注销任何服务实例,直至收到的心跳数恢复至阈值以上,该微服务退出自我保护模式。
理解
好死不如赖活:Eureka的设计哲学是宁可保留错误的服务信息,也不盲目注销可能健康的服务。所以异常的服务不会被注销,而是进入了自我保护模式。
自我保护模式的开关
在Eureka Server模块下的yml文件中的eureka:下一个缩进中添加配置信息即可,true表示打开自我保护模式;false表示关闭自我保护模式(不推荐)
- server:
- enable-self-preservation: false
介绍
系统中的微服务可以通过Eureka的服务发现去获得在Eureka中注册的服务的信息,这是一个对外暴露的接口。
使用方法(provider中)
-
注入DiscoveryClient 对象(spring包下的),在controller方法中获取
- @Autowired
- private DiscoveryClient discoveryClient;
-
- @ResponseBody
- @GetMapping("/provider/discovery")
- public Object discovery(){
- List<String> list = discoveryClient.getServices();
- System.out.println(list);
- List<ServiceInstance> insList = discoveryClient.getInstances("MICROSERVICECLOUD-DEPT");
- for (ServiceInstance si:insList) {
- System.out.println(si.getHost() +"," + si.getServiceId() +"," +si.getPort() +"," +si.getUri() +"," +si.getMetadata());
- }
- return this.discoveryClient;
- }
-
在主启动类中加入@EnableDiscoveryClient注解
- @SpringBootApplication
- @EnableEurekaClient
- @EnableDiscoveryClient
- public class Provider8001_APP {
- public static void main(String[] args) {
- SpringApplication.run(Provider8001_APP.class,args);
- }
- }
使用方法,另一种消费端中(consumer中)
在controller方法中使用restTemplate对象调用provider中暴露的URL 并获得返回对象即可
- @GetMapping("/discovery")
- public Object discovery() {
- return restTemplate.getForObject(URL_PREFIX+"/provider/discovery",Object.class);
- }
集群
集群就是在不同的机器上配置相同的服务来构建要一个大的运算整体
实现集群
-
新建N个Eureka Server模块
-
每个模块的pom.xml中加入与单个Eureka Server相同的依赖
-
每个模块加入主程序(记得加@EnableEurekaServer注解)
-
修改hosts文件(Win7的路径是C:\Windows\System32\drivers\etc)
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
-
修改Eureka Server模块的application.yml文件,加入集群,主要修改两个地方:
-
hostname:修改为hosts文件中映射的地址
-
service-url下的defaultZone节点:填入集群中另外的server服务端的地址
- server:
- port: 7001
- eureka:
- instance:
- hostname: eureka7001.com #hostname为hosts文件中映射的地址
- client:
- register-with-eureka: false #false表示不向注册中心注册自己
- fetch-registry: false #false表示自己就是注册中心,职责是维护实例,不参加检索
- service-url:
- #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置eureka server的交互地址
- defaultZone: http://eureka7002.com:7002/,http://eureka7003.com:7003/ #其他两个服务端的地址
-
修改Eureka Client模块的application.yml文件,使其向集群注册服务
-
service-url下的defaultZone节点:填入集群中需要向其注册server服务端的地址
- eureka:
- client:
- service-url:
- defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
-
访问地址
http://eureka7001.com:7001
http://eureka7002.com:7002
http://eureka7003.com:7003
-
==注:defaultZone中eureka/后缀是必须的,如果删除,Server类不会报错,但是Client注册时会报404错误==
Eureka与Zookeeper对比
CAP设计原则不同
Eureka遵守AP,Zookeeper遵守CP(C:强一致性,A:高可用,P:分区容错性,三者只能选其二,高并发下P必选)
网络波动下两者的处理对比
Zookeeper Eureka 当网络出现故障时,剩余zk集群会发起投票选举新的leader,但是此过程会持续30~120s,此过程对于高并发来说十分漫长,会导致整个注册服务的瘫痪,这是不可容忍的 在15分钟内85%的节点都没有心跳,则注册中心 会认为客户端与之出现了网络故障,则会进入自动保护模式。1.Eureka不会移除没有收到心跳的服务;2.新的服务仍能在服务端注册,但是暂时不会被同步到其他节点上直到网络稳定 结论
Eureka可以很好的应对网络故障导致部分节点失去连接的情况,而不会像zookeeper那样导致整个注册服务系统的瘫痪。
-