一、服务注册与发现
使用 Eureka 来充当 注册中心 ,
在 Eureka 单机版,这时需要把registerWithEureka(是否注册到其他Eureka上)/ fechRegistry(是否与其他Eureka数据同 步)改成 false
在 Eureka 集群中 ,需要相互注册 ,这时需要把 registerWithEureka / fechRegistry 改成 true
在消费者 和 生成者 的启动类上:
@EnableDiscoveryClient启用 Eureka 发现服务项,可以支持其他发现组件
@EnableEurekaClient 只支持Eureka
二、Eureka自我保护
当你在 Eureka 可视化界面上看到一段红字 如下:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
表示 Eureka启动自我保护模式,这是 节点失效 后 , Eureka 不会踢脚无效服务。当eureka 注册中心启动时,会向相邻节点获取 所有实例注册表信息。
eureka:
server:
# false 关闭自我保护,不管如何都要剔除心跳检测异常的服务
enableSelfPreservation: false
## 主动失效检测间隔,配置成5秒
evictionIntervalTimerInMs: 4000
三、代码如下:
1、注册中心启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
private static final Logger logger = LoggerFactory.getLogger(EurekaServerApplication.class);
public static void main(String[] args) throws Exception {
final ApplicationContext applicationContext = SpringApplication.run(EurekaServerApplication.class, args);
Environment environment = applicationContext.getEnvironment();
logger.info("\n---------------------------------\n\t"
+"Application '{}' is running! Access URLS: \n\t "+ "Local: \t\thttp://localhost:{}\n\t"
+"External:\thttp://{}:{}\n---------------------------------",
environment.getProperty("spring.application.name"),
environment.getProperty("server.port"), InetAddress.getLocalHost().getHostAddress(),environment.getProperty("server.port"));
}
}
2、application.yml
server:
port: 8002
spring:
application:
name: eureka-server
cloud:
server:
ipAddress:192.168.59.10
eureka:
instance:
# 默认使用主机名,不可使用ip, eureka.instance.perferIpAddress: true 可以使用IP进行注册
hostname: master
preferIpAddress: false
## 心跳间隔,5秒
leaseRenewalIntervalInSeconds: 5
## 没有心跳的淘汰时间,10秒
leaseExpirationDurationInSeconds: 30
client:
#由于该应用为注册中心,所以设置为 false,代表不向注册中心注册自己
registerWithEureka: true
#是否拉取信息
fetchRegistry: true
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8000/eureka/,http://${eureka.instance.hostname}:8001/eureka/
server:
# false 关闭自我保护,不管如何都要剔除心跳检测异常的服务
enableSelfPreservation: false
## 主动失效检测间隔,配置成5秒
evictionIntervalTimerInMs: 4000
3、pom.xml
<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.springCloud.eureka</groupId>
<artifactId>SpringCloudEureka</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>SpringCloudEureka</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!-- spring-cloud-starter-eureka-server用于Eureka的服务注册 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring-cloud-starter-config 用于配置管理(比如对bootstrap.yml和application.yml等统一管理)。 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--用于测试的,本例可省略-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spring-boot-starter-actuator 管理工具/web 查看堆栈,动态刷新配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<!--依赖管理,用于管理spring-cloud的依赖-->
<!--spring-cloud-starter-parent ????-->
<!--spring-cloud-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>
</project>
四、打包发布
使用maven打包成jar,2>&1 表示 所有输出 , 最后的& 表示后台运行
java -jar xxxxxx.jar > log.file 2>&1 &
也可以指定配置文件后缀启动,这是配置文件为 application-test.yml
java -jar xxxxxx.jar --spring.profiles.active=test
五、常见问题
1、消费者是用restTemplate
RestTemplate 要使用 数组 而不是 List
//这么写会报错
List<T> list = this.restTemplate.getForObject("http:// xxxxx",List.class);
// 没问题
T[ ] array = this.restTemplate.getForObject("http:// xxxxx",T[ ].class);
List<T> list = Arrays.asList(array);