1.编写Eureka入门案例
(1)@EnableEurekaServer注解的作用是什么?
通过注解在Spring Boot项目启动时启动Eureka Server。
2.创建集群版的Eureka注册中心
(1)创建一个Maven的jar项目。
(2)修改POM文件,添加Eureka Server启动器。
<!--Eureka注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
(3)修改POM文件,添加Spring Boot的Web启动器。
<!--启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(4)修改全局配置文件,添加注册中心配置。
spring.application.name=eureka-server
server.port=8761
#设置eureka的实例名称,以配置文件的变量为主
eureka.instance.hostname=eureka1
(5)修改全局配置文件,添加其他配置中心地址。
#设置服务注册中心地址,指向另一个服务
eureka.client.service-url.defaultZone=http://user:123456@eureka2:8761/eureka/
(6)添加Logback配置文件。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.base}/logs/" />
<!-- 控制台输出 -->
<appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="Stdout" />
<appender-ref ref="RollingFile" />
</root>
<!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
日志异步到数据库
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
连接池
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>
3.Eureka集群部署
(1)项目打包命令是什么?
Install
(2)启动项目是如何加载不同的配置文件?
在启动脚本文件给定不同配置文件的变量名称
(3)如何修改Linux的Host文件?
Vim /etc/hosts
192.168.70.134 eureka1
192.168.70.135 eureka2
4.创建provider服务
(1)@EnableEurekaClient注解的作用是什么?
通过注解在Spring Boot项目启动时启动微服务
5.注册服务并测试接口
(1)启动Provider。
(2)在注册中心管理页面中,查看是否含有Provider服务。
(3)启动浏览器,访问Provider服务做接口测试。
6.创建consumer服务
(1)创建一个Maven的jar项目。
(2)修改POM文件,添加Eureka启动器。
(3)修改POM文件,添加Spring Boot的Web启动器。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(4)修改全局配置文件,添加注册中心集群配置。
spring.application.name=eureka-consumer
server.port=9091
#设置服务注册中心地址,指向另一个服务
eureka.client.service-url.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
(5)在Service中通过LoadBalancerClient完成对服务的调用。
@Service
public class UserService {
@Autowired
//ribbon负载均衡器,根据其他服务的名称返回服务的实例
private LoadBalancerClient loadBalancerClient;
public List<User> getUser(){
//1.获取服务实例:si:eureka-provider服务的实例。封装了服务的基本信息:IP,端口
ServiceInstance si = this.loadBalancerClient.choose("eureka-provider");
//2.拼接访问服务的 URL
//http://localhost:9090/user
StringBuffer sb=new StringBuffer();
sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/user");
//3.通过springMVC的 RestTemplate请求服务
RestTemplate rt=new RestTemplate();
//获取返回类型
ParameterizedTypeReference<List<User>> type=new ParameterizedTypeReference<List<User>>() {};
//4.ResponseEntity:封装了返回值信息:参数为url,请求方法,null,返回类型
ResponseEntity<List<User>> response=rt.exchange(sb.toString(), HttpMethod.GET,null,type);
List<User> list = response.getBody();
return list;
}
}
(6)创建Controller,在Controller中注入Service对象。
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/consumer")
public List<User> getUser(){
return this.userService.getUser();
}
}
7.在consumer中调用provider服务
(1)启动Consumer服务。
(2)测试Consumer服务,查看调用Provider所返回的数据。
8.Eureka架构图原理
(1)请描述Eureka架构原理。
Register(服务注册):把自己的 IP 和端口注册给 Eureka。
Renew(服务续约):发送心跳包,每 30 秒发送一次。告诉 Eureka 自己还活着。
Cancel(服务下线):当 provider 关闭时会向 Eureka 发送消息,把自己从服务列表中删除。防
止 consumer 调用到不存在的服务。
Get Registry(获取服务注册列表):获取其他服务列表。
Replicate(集群中数据同步):eureka 集群中的数据复制与同步。
Make Remote Call(远程调用):完成服务的远程调用。
9.什么是CAP定理
(1)什么是CAP原则?
CAP 原则又称 CAP 定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。
(2)C、A、P分别表示什么?
(3)CA、CP、AP分别表示什么含义?
10.ZooKeeper与Eureka的区别
(1)Zookeeper与Eureka有哪些区别?
11.Eureka的服务自我保护
(1)什么是自我保护模式?
(2)为什么要启动自我保护?
12.关闭Eureka的服务自我保护
(1)如何关闭自我保护?
修改 Eureka Server 配置文件
#关闭自我保护:true:开启自我保护,false:关闭
eureka.server.enable-self-preservation=false
#清理间隔(单位:毫秒,默认是60*1000)
eureka.server.eviction-interval-timer-in-ms=60000
13.服务的优雅停服
(1)如何实现优雅停服?
1.添加坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.修改配置文件
#配置优雅停服
management.endpoints.web.exposure.include=shutdown
#启动shutdown
management.endpoint.shutdown.enabled=true
3.访问URL:http://ip:port/actuator/shutdown
(
2)访问优雅停服的URI是什么?
http://ip:port/actuator/shutdown
14.开启Eureka注册中心的安全认证
(1)实现Eureka安全认证的步骤是什么?
1.添加坐标
<!--Eureka注册中心的安全认证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.修改配置文件
#注册中心安全认证
spring.security.user.name=user
spring.security.user.password=123456
3.注册地址改为
#设置服务注册中心地址,指向另一个服务
eureka.client.service-url.defaultZone=http://user:123456@eureka2:8761/eureka/
4.启动启动类,访问注册中心则需用户名密码
(2)如果开启安全认证,注册中心在集群环境下各个节点访问时,如何传递用户名与密码?
eureka.client.service-url.defaultZone=http://user:123456@eureka1:8761/eureka/, http://user:123456@eureka2:8761/eureka/