springcloud学习笔记-Eureka服务注册与发现
springcloud学习笔记
下面所有的7002项目名称和端口均改为7003,8002项目名称和端口也改为8003
Eureka基础知识
单机Eureka的构建步骤
IDEA生成EurekaServer端服务provider注册中心
- 创建子模块cloud-eureka-server7001
- POM文件中添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- 引入自定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>pers.chao.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- boot web actuator -->
<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>
</dependencies>
- 修改application.yml文件
server:
port: 7001
eureka:
instance:
#eureka服务端的实例名称
hostname: localhost
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,职责是维护实例,并不需要检索服务
fetch-registry: false
service-url:
#设置与Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# defaultZone: http://eureka7002.com:7002/eureka/ #集群指向其他eureka
- 写主动类,服务注册中心
@EnableEurekaServer
@SpringBootApplication
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class);
}
}
- 测试,在地址栏输入localhost:7001,出现Eureka服务注册中心界面:
服务中心总没有服务注册进来
EurekaClient端cloud-provider-payment8001将注册进EurekaServer成为服务提供者
- 修改pom文件添加Eureka相关依赖
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 修改applicatin.yml文件
eureka:
client:
#是否将自己注册到注册中心, 默认true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,单机无所谓,集群必须设置为true配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka #单机版
- 修改启动类
@EnableEurekaClient
@SpringBootApplication
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class);
}
}
- 测试:访问localhost:7001
EurekaClient端cloud-consumer-order80将注册进EurekaServer成为服务消费者consumer
步骤和8001一样,不再叙述
集群Eureka构建步骤
- Eureka集群原理说明
如果单个服务不可用,则造成整个业务不可用 - EurekaServer集群环境搭建构建,构建cloud-eureka-server7002
- 添加依赖和写主动类
- 修改windows本地hosts文件
- 修改cloud-eureka-server7002的application.yml文件
server:
port: 7001
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/
# defaultZone: http://eureka7002.com:7002/eureka/ #集群指向其他eureka
- 修改cloud-eureka-server7001的application.yml文件
server:
port: 7002
eureka:
instance:
#eureka服务端的实例名称
hostname: eureka7002.com
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,职责是维护实例,并不需要检索服务
fetch-registry: false
service-url:
#设置与Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/
# defaultZone: http://eureka7002.com:7002/eureka/ #集群指向其他eureka
- 测试
相互访问,相互可以看到注册了对方
- 将支付服务8001微服务注册发布到7001和7002Eureka集群中
修改8001application.yml文件如下:
- 将订单服务80微服务发布到7001和7002集群配置中
修改80的application.yml文件同样如此 - 支付服务提供者8001集群环境搭建
目的是提供多个可用性服务,防止单个微服务宕机
创建cloud-provider-payment8002微服务模块,8001和8002的配置完全相同, 相当于是8001的克隆复制
访问:http://localhost:7001/出现如下:
我们到目前为止,80服务的访问实例是写死的:
我们修改为微服务的名称,让调用微服务方只关心微服务名称,而不关心由谁来提供微服务。
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
随后进行测试:
结果出错,报错信息为调用的服务不清楚是哪个主机提供服务
我们为RestTemplate添加注解@LoadBalanced,开启RestTemplate的负载均衡功能:
并在8001和8003微服务的controller修改代码如下,以明显观察调用成功后端口的变化:
重新访问:
如果不断的访问,将会是由8001和8003轮询交替提供服务。
actuator微服务信息完善
引入依赖,一般搭配web-starter依赖一起使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
-
主机名称:服务名称修改
修改8001和8002的application.yml文件
-
访问信息有IP信息提示
鼠标放在实例名称上,电脑左下角有IP地址信息提示
同样修改application.yml文件
instance:
instance-id: payment8001
prefer-ip-address: true
测试:
服务发现Discovery
- 修改主启动类,添加类注解@EnableDiscoveryClient
- 在controller类中编写自测方法:
@GetMapping(value = "/payment/discovery")
public Object discovery(){
List<String> services= discoveryClient.getServices();
for(String element : services){
log.info("*******"+element);
}
List<ServiceInstance> instances=discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for(ServiceInstance instance: instances){
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
- 测试:
Eureka自我保护
某时刻某一个微服务不可用了(可能是因为网络故障原因),Eureka不会立刻清理,依旧会对该微服务的信息进行保存
Eureka的自我保护机制默认为开启的,通过在application.yml文件中修改eureka.server.enable-self-preservation=false来设置