Springcloud学习笔记(二)

Springcloud学习笔记(二)

八月 17, 2019

二、Eureka配置

  • 新建springcloud-study-euraka-7001工程,导入相关依赖

pom文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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>
<parent>
<groupId>com.gxs.springcloud</groupId>
<artifactId>spring-cloud-study</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

<artifactId>springcloud-study-euraka-7001</artifactId>

<dependencies>
<!--eureka-server 服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!--热部署 修改后立即生效-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

</dependencies>

</project>

yml文件配置

1
2
3
4
5
6
7
8
9
10
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己
fetch-registry: false #false 表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与eureka server 交互的地址查询服务和注册服务都需要依赖的地址

1、将服务注册进Eureka

  • 8001provider服务中添加配置
1
2
3
4
5
6
7
8
9
10
<!--将微服务provider注册进eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  • 修改8001的yml配置
1
2
3
4
5
#客户端注册进eureka服务列表
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
  • 8001 启动类增加@EnableEurekaClient注解
1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaClient
public class DeptProvider8001App {

public static void main(String[] args) {
SpringApplication.run(DeptProvider8001App.class,args);
}
}
  • 注册成功,在7001的Eureka服务站中会显示

2、actuator与注册微服务信息完善

actuator:在springboot中主管监控和配置

  • 主机名称、服务名称修改

    1、修改8001的yml配置

    1
    2
    3
    4
    5
    6
    7
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:7001/eureka
    #服务实例名称修改
    instance:
    instance-id: study-springcloud-dept8001
  • 访问信息有ip信息提示

    修改8001yml配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #客户端注册进eureka服务列表
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:7001/eureka
    instance:
    #服务实例名称修改
    instance-id: study-springcloud-dept8001
    #访问路径显示IP地址
    prefer-ip-address: true
  • 微服务info内容详细信息

    1、修改8001的pom文件,增加actuator的配置

    1
    2
    3
    4
    5
    <!--actuator监控自信息完善-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    2、父工程pom文件修改,增加build信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <build>
    <!--finalName 父工程名称-->
    <finalName>spring-cloud-study</finalName>
    <resources>
    <resource>
    <directory>src/main/resources</directory>
    <!--过滤开启-->
    <filtering>true</filtering>
    </resource>

    </resources>
    <!--增加插件-->
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <!--配置插件解析-->
    <configuration>
    <delimiters>
    <delimit>$</delimit>
    </delimiters>
    </configuration>
    </plugin>
    </plugins>
    </build>

    3、修改8001的yml,增加info信息

    1
    2
    3
    4
    5
    info:
    app.name: study-springcloud-micoservices
    company.name: www.gxs.com
    build.artifactId: $project.artifactId$
    build.version: $project.version$

3、Eureka自我保护机制

  • Netflix在设置Eureka时,遵循AP原则

  • 某时刻某一微服务不可用时,eureka不会立刻清理,依旧会对改微服务的信息进行保存。服务失去心跳、名称变更、网络拥堵

  • 自我保护机制:应对网络异常的安全措施

    默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险——因为微服务本身其实是健康的,==此时本不应该注销这个服务==。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点再短时间内丢失过多客户端时(可能发生网络故障),那么这个节点就会进入自我保护模式。一旦进去该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也即不会注销任何微服务)。当网络故障恢复后,改EurekaServer节点会自动退出自我保护模式。

    ==宁可保护错误的注册信息,也不盲目注销任何可能健康的微服务实例==

    禁用自我保护机制

    可以使用eureka.server.enable-self-preservation=false

4、Eureka服务发现

对于注册进eureka里面的服务,可以通过服务发现获得该服务的信息

==供消费者调用==

1、添加服务发现接口

在8001工程的Controller类中增加DiscoveryClient

1
2
@Autowired
private DiscoveryClient discoveryClient;
2、增加自己服务描述的接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RequestMapping(value = "/dept/discovery",method = RequestMethod.GET)
public Object discovery(){
List<String> list = discoveryClient.getServices();
List<ServiceInstance> instances = discoveryClient.getInstances("STUDY-SPRINGCLOUD-DEPT");

for (ServiceInstance element :instances){
System.out.println(element.getServiceId());
System.out.println(element.getHost());
System.out.println(element.getPort());
System.out.println(element.getUri());
}
return this.discoveryClient;

}
3、8001主启动类中增加 @@EnableDiscoveryClient注解
4、启动,调用http://localhost:8001/dept/discovery

8001需要等待注入一段时间,注入进server

5、在80消费端中增加相应调用
1
2
3
4
5
6
@RequestMapping(value = "/consumer/dept/discovery")
public Object discovery(){
return restTemplate.getForObject(
REST_URL_PREFIX+"/dept/discovery",
Object.class);
}