微服务SpringCloud开弓之Eureka服务注册与发现《三》
目录
1、Eureka基础知识
- 什么是服务治理
- 什么是服务注册
- Eureka两组件
2、单机Eureka构建步骤
-
IDEA生成EurekaServer端服务注册中心
建Module
cloud-eureka-server7001
-
改POM
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
写YML
eureka: instance: hostname: localhost #eureka服务端的实例名称 client: #false表示不向注册中心注册自己 register-with-eureka: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: false service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
-
主启动
@SpringBootApplication @EnableEurekaServer public class EurekaMain7001 { public static void main(String[] args) { SpringApplication.run(EurekaMain7001.class,args); } }
测试
- http://localhost:7001/
IDEA生成Eurekaclient端注册到服务端
配置Pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency>
yam
eureka: client: #false表示不向注册中心注册自己 register-with-eureka: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: true service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 defaultZone: http://localhost:7001/eureka
主启动
@SpringBootApplication @EnableEurekaClient public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class,args); } }测试
1、先启动EurekaServer
2、http://localhost:7001/
3、测试
4、自我保护机制
注意
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
yam的配置注意缩进以及空格问题
3、集群Eureka构建步骤
解决办法: 搭建Eureka注册中心集群,实现负载均衡+故障容错
互相注册,互相守望
-
新建cloud-eureka-server7002
参考cloud-eureka-server7001
-
改POM
<dependencies> <!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- 引用自定义的api通用包,可以使用Payment支付Entity--> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-common</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--一般为通用配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
修改映射配置
1、修改映射配置添加hosts文件
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
2、刷新hosts文件
ipconfig /flushdns
-
配yml
7001中的yaml
server: port: 7001 spring: application: name: cloud-eureka-service eureka: instance: # eureka服务端的实例名称 hostname: eureka7001.com client: # false表示不向注册中心注册自己 register-with-eureka: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务 fetch-registry: false service-url: # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 defaultZone: http://eureka7002.com:7002/eureka/
7002中的yaml
server: port: 7002 spring: application: name: cloud-eureka-service2 eureka: instance: hostname: eureka7002.com client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://eureka7001.com:7001/eureka/
主启动
@SpringBootApplication @EnableEurekaServer public class EurekaMain7002 { public static void main(String[] args) { SpringApplication.run(EurekaMain7002.class,args); } }
将支付服务8001微服务发布到上面2台Eureka集群配置中
配yaml
eureka: client: #false表示不向注册中心注册自己 register-with-eureka: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: true service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 # defaultZone: http://localhost:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
将订单服务80微服务发布到上面2台Eureka集群配置中
- 配yaml
server: port: 80 spring: application: name: Cloud-order-serviceeureka: client: #false表示不向注册中心注册自己 register-with-eureka: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: true service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 # defaultZone: http://localhost:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
测试01
- 先要启动EurekaServer,7001/7002服务
- 再要启动服务提供者provider,8001
- 再要启动消费者,80
- http://localhost/consumer/payment/get/31
4、支付服务提供者8001集群环境搭建
-
新建cloud-provider-payment8002
参考cloud-provider-payment8001
-
改POM
与cloud-provider-payment8001相同
<dependencies> <!-- eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-common</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> </dependency> <!--mysql-connector-java--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
YAML
eureka: client: #false表示不向注册中心注册自己 register-with-eureka: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: true service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 # defaultZone: http://localhost:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
-
主启动
@SpringBootApplication @EnableEurekaClient public class PaymentMain8002 { public static void main(String[] args) { SpringApplication.run(PaymentMain8002.class,args); } }
-
业务类
和8001一样
-
修改8001/8002的controller
负载均衡
- 订单服务访问地址不能写死
-
使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力 public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
-
ApplicationContextBean
Ribbon的负载均衡功能
-
测试
5、actuator微服务信息完善
-
主机名称:服务名称修改以及没有IP提示
当前问题
修改cloud-provoder-payment8001、cloud-provoder-payment8001
eureka: client: #false表示不向注册中心注册自己 register-with-eureka: true #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务 fetch-registry: true service-url: #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址 # defaultZone: http://localhost:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eurekainstance: instance-id: payment8001\8002 prefer-ip-address: true
效果
6、服务发现Discovery
对于注册eureka里面的微服务,可以通过服务发现来获得该服务的信息
-
修改cloud-provider-payment8001的Controller
import org.springframework.cloud.client.discovery.DiscoveryClient; @Resource private DiscoveryClient discoveryClient; @GetMapping(value = "/payment/discovery") public Object discovery(){ List<String> services = discoveryClient.getServices(); for (String element : services) { log.info("########element:"+element); } List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PROVIDER-SERVICE"); for (ServiceInstance instance : instances) { log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri()); } return this.discoveryClient; }
-
8001的启动类
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class,args); } }
-
自测
-
结果
6、eureka自我保护
- 故障现象
- 原因
一句话:某时刻 一个微服务不可用了,Eureka不会立刻清理,依旧会对该服务的信息进行保存
属于CAP里面的AP分支
-
怎么禁止自我保护
注册中心eurekaServer端7001
出产默认,自我保护机制是开启的
eureka.server.enable-self-preservation=true
-
使用eureka.server.enable-self-preservation=false 可以禁用自我保护模式
自我保护机制关闭后的结果:
生产者客户端eurekaClient端8001
-
默认
eureka.instance.lease-renewal-interval-in-seconds=30 eureka.instance.lease-expiration-duration-in-seconds=90
-
配置
- 测试
欢迎转载和分享,记得点赞呀
- Spring-Cloud-Eureka服务注册发现中心server+client案列模拟说明
- Spring Cloud Eureka 服务注册与发现中心(一)
- Spring Cloud 服务注册与发现 EurekaServer搭建
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
- 服务注册和发现-Spring Cloud Eureka(一)
- SpringCloud(二):服务的注册与发现(Eureka)
- spring cloud Eureka 服务注册与服务发现的学习(1)
- 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置
- SpringCloud——服务注册与发现Eureka以及注册源码解析
- SpringCloud中的服务注册与发现----Eureka
- Spring-Cloud 服务注册与发现 Eureka
- SpringCloud服务注册与发现(Eureka 注册中心)
- spring-cloud学习(一)———eureka集群服务注册于与发现
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
- Spring Cloud Eureka 服务注册与发现
- 《Spring Cloud Netflix》-- 服务注册和服务发现-Eureka的服务认证和集群
- SpringCloud服务的注册与发现(Eureka)
- 服务注册发现Eureka之一:Spring Cloud Eureka的服务注册与发现
- 每天学点SpringCloud(二):服务注册与发现Eureka
- 1.springcloud-eureka(springcloud的服务注册和发现服务)