eureka的简单了解
-
管理服务与服务之间的依赖关系,
-
实现服务发现和注册
-
-
另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用(还是要自己去访问)
- 也就是提供方将自己注册到注册中心,消费方从注册中心获取提供方的
心跳:表示一种连接检查机制(没30秒发送一次,90秒没有没有,认为你挂了)
Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)
-
在分布式系统中的所有数据备份,在同一时刻是否同样的值所有节点在同一时间的数据完全一致,越多节点,数据同步越耗时
-
可用性(A):负载过大后,集群整体是否还能响应客户端的读写请求服务一直可用,而且是正常响应时间
-
分区容错性(P):分区容错性,就是高可用性,一个节点崩了,并不影响其它的节点,100个节点,挂了几个,不影响服务,越多机器越好
-
CA 满足的情况下,P不能满足的原因:数据同步(C)需要时间,也要正常的时间内响应(A),那么机器数量就要少,所以P就不满足
-
CP 满足的情况下,A不能满足的原因:数据同步(C)需要时间, 机器数量也多(P),但是同步数据需要时间,所以不能再正常时间内响应,所以A就不满足
-
AP 满足的情况下,C不能满足的原因:机器数量也多(P),正常的时间内响应(A),那么数据就不能及时同步到其他节点,所以C不满足
-
启动注册中心
-
服务提供方(被调用)启动的时候,将自己的信息注册到注册中心
-
有心跳检测,默认30秒一次,90秒没有,注册中心剔除信息
-
消费方定期从注册中心获取服务列表(30秒)调用者
-
调用的时候,获取服务信息方信息之后,自己调用
例子:
1.新建一个spring boot项目
2.父工程引入依赖
3.完成子模块eureka(注册中心)
4.完成子模块provider(服务提供者)
5.完成子模块consumer(消费者)
引入依赖:
<properties> <java.version>1.8</java.version> <spring.cloud-version>Hoxton.SR8</spring.cloud-version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud-version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
完成eureka模块:
引入依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
编写application.yml配置文件
server: port: 7001 spring: application: name: cs-eureka eureka: instance: # 地址 通常是域名 hostname: localhost client: service-url: # 客户端与EurekaServer的交互地址,如果是集群,需要多个地址 defaultZone: http://localhost:7001/eureka/ register-with-eureka: false # 是不是将自己注册进eureka 默认 true fetch-registry: false # 自己就是服务,不需要从eurekaServer获取服务信息,默认true
配置类添加@EnableEurekaServer注解
@SpringBootApplication @EnableEurekaServer //开启服务 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
完成服务提供者:
引入依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
编写application.yml配置文件
spring:
application:
name: provider
server:
port: 8002
eureka:
client:
# eureka服务端的路劲
service-url:
defaultZone: http://localhost:7001/eureka/
# 如果不想将改服务注册进注册中心,一定要写成false
register-with-eureka: true
instance:
prefer-ip-address: true
配置类添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient // 启动客户端
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
ProviderController.java
@RestController @RequestMapping("/provider") public class ProviderController { @Value("${server.port}") private String port; @GetMapping("/port") public String getPort(){ return "来自提供者consumer" + port; } }
完成服务消费者:
引入依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
编写application.yml配置文件
spring:
application:
name: consumer
server:
port: 9001
eureka:
client:
# eureka服务端的路径,这个就是eureka模块设置的地址
service-url:
defaultZone: http://eureka1:7001/eureka/
# 是不是将自己注册进eureka 默认 true,所以这里可以省略不写
register-with-eureka: false
fetch-registry: false
配置类添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient // 启动客户端
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
配置类注入RestTemplate
@Configuration public class ConsumerConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
ConsumerController.java
@RestController @RequestMapping("/consumer") public class ConsumerController { //未在配置类或启动类注入会报红 private final RestTemplate restTemplate; public ConsumerController(RestTemplate restTemplate, DiscoveryClient discoveryClient) { this.restTemplate = restTemplate; } // 调用consumer的方法,获取这个port 最常见的方式 http调用,比如 httpClient @RequestMapping("/port") public String getPort() { return restTemplate.getForObject("http://localhost:8002/provider/port", String.class); }
首先运行注册中心eureka模块
然后运行提供者provider模块
这个时候可以访问注册中心
可以看到有一个服务提供者注册了进来
最后运行服务消费者
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)