微服务【SpringCloud】成长之路(一)【Eureka】
遇到面试问题 springcloud都有哪些版本?
| Spring Boot |Spring Cloud
|1.2.x |Angel版本
|1.3.x |Brixton版本
|1.4.x stripes |Camden版本
|1.5.x |Dalston版本、Edgware版本
|2.0.x |Finchley版本
|2.1.x |Greenwich版本
创建聚合工程
创建空的maven项目
删掉父工程的src目录,习惯了
导入依赖 pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dahuilang</groupId>
<artifactId>springcloud-dahuilang</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloud-eureka-5001</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<lombok.version>1.18.12</lombok.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencyManagement>
<dependencies>
<!--springcloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springboot的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
<scope>import</scope>
</dependency>
<!--springboot启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
<scope>import</scope>
</dependency>
<!--日志测试~-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
创建模块 springcloud-eureka-5001
springcloud-eureka-5001的 pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-dahuilang</artifactId>
<groupId>com.dahuilang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-eureka-5001</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
springcloud-eureka-5001的 application.yml
server:
port: 5001
#Eureka配置
eureka:
instance:
hostname: eureka5001.com #Eureka 服务端的名字
client:
register-with-eureka: false #是否向注册中心注册当前的服务
fetch-registry: false #fetch-registry 为false时,当前服务为注册中心,非集群版,不需要同步其他节点数据
service-url: #代码中Eureka的默认访问路径 http://localhost:8761/eureka/
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka #非集群模式
#defaultZone: http://eureka5002.com:5002/eureka/,http://eureka5003.com:5003/eureka/ #集群模式 互注册
创建启动类
package com.dahuilang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer5001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer5001.class,args);
}
}
启动并访问
官网地址:https://spring.io/projects/spring-cloud-netflix
主要配置
Spring Cloud Eureka 主要分为下面三个模块的参数:
- Eureka Server | Eureka Client | Eureka Instance
Eureka Server【org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean】
Eureka Server 的配置参数格式:eureka.server.xxx。
enable-self-preservation :表示注册中心是否开启服务的自我保护能力。
renewal-percent-threshold:表示 Eureka Server 开启自我保护的系数,默认:0.85。
eviction-interval-timer-in-ms:表示 Eureka Server 清理无效节点的频率,默认 60000 毫秒(60 秒)。
Eureka Instance【org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean】
Eureka Instance 的配置参数格式:eureka.instance.xxx。
instance-id:表示实例在注册中心注册的唯一ID。
prefer-ip-address:
true:实例以 IP 的形式注册
false:实例以机器 HOSTNAME 形式注册
lease-expiration-duration-in-seconds:表示 Eureka Server 在接收到上一个心跳之后等待下一个心跳的秒数(默认 90 秒),若不能在指定时间内收到心跳,则移除此实例,并禁止此实例的流量。此值设置太长,即使实例不存在,流量也能路由到该实例此值设置太小,由于网络故障,实例会被取消流量,需要设置为至少高于 lease-renewal-interval-in-seconds 的值,不然会被误移除了。
lease-renewal-interval-in-seconds:表示 Eureka Client 向 Eureka Server 发送心跳的频率(默认 30 秒),如果在 lease-expiration-duration-in-seconds 指定的时间内未收到心跳,则移除该实例。
Eureka Client 【org.springframework.cloud.netflix.eureka.EurekaClientConfigBean】
Eureka Client 的配置参数格式:eureka.client.xxx。
register-with-eureka:表示此实例是否注册到 Eureka Server 以供其他实例发现。在某些情况下,如果你不想自己的实例被发现,而只想发现其他实例,配置为 false 即可。
fetch-registry:表示客户端是否从 Eureka Server 获取实例注册信息。
serviceUrl.defaultZone:表示客户端需要注册的 Eureka Server 的地址。
Eureka服务提供者
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml
# spring的配置
spring:
application:
name: springcloud-provider-dept
# Eureka的配置
eureka:
client:
service-url:
defaultZone: http://eureka5001.com:5001/eureka/,http://eureka5002.com:5002/eureka/,http://eureka5003.com:5003/eureka/
instance:
instance-id: springcloud-provider-dept-8001 #修改默认描述信息
info:
app.name: springcloud-XXXX #项目的名称
company.name: com.XXXX #公司的名称
启动类
@SpringBootApplication
@EnableEurekaClient //在启动后注册到Eureka服务中
@EnableDiscoveryClient //服务发现
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
@RestController
public class DeptController {
@Autowired
DeptService deptService;
//获取一些配置的信息,得到具体的微服务!
@Autowired
private DiscoveryClient client;
//注册进来的微服务~,获取一些消息~
@GetMapping("/dept/discovery")
public Object discovery() {
//获取微服务列表的清单
List<String> services = client.getServices();
System.out.println("discovery=>services:" + services);
//得到一个具体的微服务信息,通过具体的微服务id,applicaioinName;
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
for (ServiceInstance instance : instances) {
System.out.println(
instance.getHost() + "\t" + // 主机
instance.getPort() + "\t" + // 端口
instance.getUri() + "\t" + // 地址
instance.getServiceId() // 服务id
);
}
return this.client;
}
}
待续