赞
踩
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
同时,服务提供方与Eureka之间通过“心跳” 机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。
这就实现了服务的自动注册、发现、状态监控。
Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写。
一个消费者和一个生产者
多个消费者与多个生产者
下图显示了Eureka Server与Eureka Client的关系
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server: port: 9001 # eureka默认端口号为8761 eureka: client: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址 service-url: defaultZone: http://127.0.0.1:${server.port}/eureka # 不把自己注册到eureka服务列表 register-with-eureka: false # 拉取eureka服务信息 fetch-registry: false #false表示自己就是注册中心,不需要从注册中心获取注册列表信息 instance: #客户端在注册时使用自己的IP而不是主机名 prefer-ip-address: true # 实例id instance-id: ${spring.cloud.ip-address}:${spring.application.name}:${server.port} logging: level: root: debug
register-with-eureka: false false表示不向注册中心注册自己
fetch-registry: false false表示自己就是注册中心,不需要从注册中心获取注册列表信息
service-url 设置eureka server交互的地址查询服务和注册服务都需要用到这个地址(单机用)
在eureka-server的主启动类上开启eureka服务**@EnableEurekaServer**
package com.tianju.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer // 声明当前springboot应用是一个eureka服务中心
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class);
}
}
启动eureka-server子项目,在浏览器上访问localhost:9001
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 在provider的pom文件中添加监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
server: port: 10010 eureka: client: #客户端注册到eureka列表中 service-url: defaultZone: http://127.0.0.1:9001/eureka instance: prefer-ip-address: true #显示访问url 客户端在注册时使用自己的IP而不是主机名 # # 实例id # instance-id: ${spring.cloud.ip-address}:${spring.application.name}:${server.port} instance-id: provider-10010 #注册中心显示出来的微服务名称 # 应用名称 spring: application: name: springCloud-provider info: app.name: SpringCloud company.name: tianju build.artifactId: $project.artifactId$ build.version: $project.version$
package com.tianju.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient // 或 @EnableDiscoveryClient
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
在使用Spring Cloud feign使用中在使用服务发现的时候提到了两种注解:
一种为@EnableDiscoveryClient;
一种为@EnableEurekaClient,用法上基本一致
spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等),
@EnableDiscoveryClient基于spring-cloud-commons;
@EnableEurekaClient基于spring-cloud-netflix。
其实用更简单的话来说,就是如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient, 如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient。
注解@EnableEurekaClient上有@EnableDiscoveryClient注解,可以说基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,另外上面的注释中提到,其实@EnableEurekaClient注解就是一种方便使用eureka的注解而已,可以说使用其他的注册中心后,都可以使用@EnableDiscoveryClient注解,但是使用@EnableEurekaClient的情景,就是在服务采用eureka作为注册中心的时候,使用场景较为单一。
修改配置信息,变成了20s
lease-renewal-interval-in-seconds: 20 #心跳时间
server: port: 10010 eureka: client: #客户端注册到eureka列表中 service-url: defaultZone: http://127.0.0.1:9001/eureka instance: prefer-ip-address: true #显示访问url 客户端在注册时使用自己的IP而不是主机名 # # 实例id # instance-id: ${spring.cloud.ip-address}:${spring.application.name}:${server.port} instance-id: provider-10010 #注册中心显示出来的微服务名称 lease-renewal-interval-in-seconds: 20 #心跳时间 lease-expiration-duration-in-seconds: 60 #下线时间 # 应用名称 spring: application: name: springCloud-provider info: app.name: SpringCloud company.name: tianju build.artifactId: $project.artifactId$ build.version: $project.version$
注册到eureka
主启动类
package com.tianju.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient public class ConsumerApp { public static void main(String[] args) { SpringApplication.run(ConsumerApp.class); } @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
package com.tianju.consumer.controller; import com.netflix.appinfo.InstanceInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.List; @RestController @RequestMapping("/consumer") @Slf4j public class ConsumerController { @Resource private DiscoveryClient discoveryClient; @Autowired private RestTemplate restTemplate; @RequestMapping("/getId/{id}") public String getMsg(@PathVariable("id") String id) { List<ServiceInstance> instances = discoveryClient.getInstances("springCloud-provider"); ServiceInstance instance = instances.get(0); String host = instance.getHost(); int port = instance.getPort(); log.debug("消费者拼出路径+端口:"+ host+":"+port); // 获取ip和端口信息,拼接成服务地址 String baseUrl = "http://" + instance.getHost() + ":" + instance.getPort() + "/provider/get/" + id; String consumer = restTemplate.getForObject(baseUrl, String.class); log.debug("采用restTemplate调用生产者:"+baseUrl); return "消费者调用生产者获得消息:"+consumer; } }
Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
Register 服务注册
当Eureka客户端向Eureka Server注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。
Eureka客户会每隔30秒发送一次心跳来续约。通过续约来告知Eureka Server该Eureka客户仍然存在,没有出现问题。正常情况下,如果Eureka Server在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除。建议不要更改续约间隔。
Eureka客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30秒钟)更新一次。每次返回注册列表信息可能与Eureka客户端的缓存信息不同, Eureka客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka客户端则会重新获取整个注册表信息。 Eureka服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka客户端和Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的情况下Eureka客户端使用压缩JSON格式来获取注册列表的信息。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka客户端则会重新获取整个注册表信息。 Eureka服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka客户端和Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的情况下Eureka客户端使用压缩JSON格式来获取注册列表的信息。
[外链图片转存中…(img-fPV3wd7Z-1715059120172)]
[外链图片转存中…(img-EZX1piXk-1715059120172)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。