Spring Cloud Eureka
🐻 一个服务注册与发现的组件
🐻🐻🐻🐻🐻🐻ZT😄🐻🐻🐻🐻🐻🐻🐻🐻🐻
- 注重AP(服务可用性)
🐻🐻🐻🐻🐻🐻XZL🐻🐻🐻🐻🐻🐻🐻🐻🐻
开始使用
1.创建项目
- 创建一个maven项目(自定义项目名)
- 在该项目下新建一个模块(01-eureka)maven项目
- 在该模块下创建多个模块(springboot项目)
- 创建模块1:eureka-server-01
1.1创建步骤:
直接点击下一步
配置项目信息
选择依赖
- 服务端选择:
- 客户端选择:(eureka discovery client+web)
最后配置模块名即可创建模块成功
1.2 修改pom.xml文件
将spring版本改为2.3.12.RELEASE
将java版本改成1.8
将springcloud版本改成Hoxton.SR12
依赖代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pengke</groupId>
<artifactId>eureka-server-01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server-01</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 依赖管理(管理版本号以及子模块的依赖)-->
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>netflix-candidates</id>
<name>Netflix Candidates</name>
<url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
1.3 编写项目配置文件(我这里用的yml文件)
服务端配置:
server:
port: 8761 #eureka默认端口 6379 8080 3306 8848
spring:
application:
name: eureka-server #应用名称,禁用特殊字符
客户端配置:
server:
port: 8080 #客户端的端口没要求
spring:
application:
name: eureka-client-a
# 注册的含义,就是将自己的一些信息发送过去
eureka:
client:
service-url: #指定注册的地址
defaultZone: http://localhost:8761/eureka
1.4 开启服务(开启客户端)
服务端(application文件中):
@EnableEurekaServer //开启eureka注册中心的功能
客户端(application文件中):
@EnableEurekaClient //开启客户端的功能
1.5 成功实现查看效果
浏览器访问:http://localhost:8761/
以上表示成功配置并使用注册中心
由于创建客户端步骤繁琐,并且发现其它配置都一致只需要修改端口号即可,这里示例一个简便创建步骤
1.1:编辑配置
1.2:copy
这样即可实现在同应用下建立另一个实例
ok了
配置文件详解
服务端
server:
port: 8761 #eureka默认端口 6379 8080 3306 8848
spring:
application:
name: eureka-server #应用名称,禁用特殊字符
eureka: #eureka配置分为三大类 server client 实例 eureka-server既是服务端也是客户端
server:
eviction-interval-timer-in-ms: 10000 #服务器间隔多少毫秒做定期删除操作
renewal-percent-threshold: 0.85 # 续约百分比 超过85%应用没续约那么eureka会保护服务 不会剔除任何一个服务
instance: # 实例的配置
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名称:应用名称:端口号
hostname: localhost #主机名称或者服务的ip
prefer-ip-address: true # 以ip形式显示具体服务信息
lease-renewal-interval-in-seconds: 5 #服务实例续约时间的间隔
客户端
server:
port: 8080 #客户端的端口没要求
spring:
application:
name: eureka-client-a
# 注册的含义,就是将自己的一些信息发送过去
eureka:
client: # 客户端配置
service-url: #指定注册的地址
defaultZone: http://localhost:8761/eureka
register-with-eureka: true # 可以不往eureka-server注册
fetch-registry: true # 应用是否去拉取服务列表到本地
registry-fetch-interval-seconds: 10 # 为了缓解服务列表脏读问题,时间越短脏读越少(浪费性能)
instance:
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名称:应用名称:端口号
hostname: localhost #主机名称或者服务的ip
prefer-ip-address: true # 以ip形式显示具体服务信息
lease-renewal-interval-in-seconds: 10 #服务实例续约时间的间隔
以上配置都在代码中以注解形式讲解
集群
集群可以创建多个Eureka应用,互相之间同步客户端注册信息,又可以独立提供服务发现与注册服务。
与之前不同的是client可指向多个地址
例如(用逗号分隔):
defaultZone:http://peer1:8761/eureka/,http://peer2:8762/eureka/
还需修改主机hosts文件
在结尾加上
主要是将本机ip地址取个别名与服务端配置名对应
127.0.0.1 peer1
127.0.0.1 peer2
集群的配置就如同上所说
服务发现
假设多个客户端向服务端注册,客户端互相联系访问即为服务发现
- 通过服务的应用名称找到服务的具体实例的过程(服务发现)
示例步骤:
- 在客户端a编写controller
- DiscoveryClient是springclound内部提供的一个属性,用于获取服务列表
- 通过
.getInstances
获取实例信息(参数名传服务名称)
package com.pengke.eurekaclienta02.controller;
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.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DiscoveryController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("test")
public String doDiscovery(String serviceName){
//这就是服务发现 通过服务应用名称找到服务的具体信息
List<ServiceInstance> instances=discoveryClient.getInstances(serviceName);
instances.forEach(System.out::println);
ServiceInstance serviceInstance=instances.get(0);//列表第一项
String ip=serviceInstance.getHost();//获取ip
int port=serviceInstance.getPort();//获取port端口
System.out.println(ip+"port:"+port);
return instances.get(0).toString();
}
}
-
客户端b配置instance信息
server: port: 8081 #客户端的端口没要求 spring: application: name: eureka-client-b # 注册的含义,就是将自己的一些信息发送过去 eureka: client: service-url: #指定注册的地址 defaultZone: http://localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} hostname: localhost lease-renewal-interval-in-seconds: 10 #续约时间
最终启动服务端,启动两个客户端,浏览器进行访问
http://localhost:8080/test?serviceName=应用名称
访问路径为客户端a的访问地址/请求的接口?serviceName=应用名称(可小写)
最终页面展示内容
出现这一步就代表成功了(通过应用名称找到服务的ip和端口)~
over🐻