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/