从零开始学分布式-eureka
本项目使用idea创建的maven项目,然后改成的springboot
首先创建父pom:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
单机
eureka-pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
eureka-application.yml
server:
port: 7001
eureka:
instance:
hostname: cloud-eureka-server
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:7001/eureka
启动类
@EnableEurekaServer
集群
相互注册相互守望
cloud-eureka-server7001
server:
port: 7001
eureka:
instance:
hostname: cloud-eureka-server
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka
cloud-eureka-server7002
server:
port: 7001
eureka:
instance:
hostname: cloud-eureka-server
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka
pom和单机版是一样的
payment-server服务注册
payment-server-pom.xml
<dependencies>
<dependency>
<groupId>com.zckj</groupId>
<artifactId>cloud-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</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>
</dependencies>
yml
server:
port: 8002
spring:
application:
name: cloud-payment-server
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002
instance:
# 注册中心中展示的实例名称
instance-id: payment8001
# 访问路径可以显示ip
prefer-ip-address: true
启动类
@EnableEurekaClient
order-server服务调用
pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</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>com.zckj</groupId>
<artifactId>cloud-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
yml文件
server:
port: 80
spring:
application:
name: cloud-order-server
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
启动类
@EnableEurekaClient
// bean--@LoadBalanced注解不能少尽行负载均衡的
@Configuration
public class SpringContextBeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
eureka显示服务ip && 实例名称
payment-yml:(原有基础上添加配置)
eureka:
instance:
# 注册中心中展示的实例名称
instance-id: payment8001
# 访问路径可以显示ip
prefer-ip-address: true
必须有spring-boot-starter-actuator依赖
服务发现Discovery
启动类添加注解 @EnableDiscoveryClient
注入DiscoveryClient对象我用的是@Resource
使用:
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/discover")
public Object discover() {
List<String> services = discoveryClient.getServices();
System.out.println("============services===============");
services.forEach(System.out::println);
List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-server");
System.out.println("============instances==============");
instances.forEach(one -> {
String host = one.getHost();
int port = one.getPort();
URI uri = one.getUri();
String path = uri.getPath();
System.out.println("host:" + host + " port:" + port + " uri:" + uri + " path:" + path);
});
return this.discoveryClient;
}
eureka自我保护机制理论知识
禁止eureka自我保护机制配置
eureka-yml
eureka:
server:
# 关闭自我保护机制,保证服务不可用时,服务被及时剔除
enable-self-preservation: false
# 多长时间未收到消息被剔除默认(60000)
eviction-interval-timer-in-ms: 2000
payment-yml
eureka:
instance:
# eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒)
lease-renewal-interval-in-seconds: 1
# eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90秒),超时将剔除
lease-expiration-duration-in-seconds: 2