1 單服務Demo
1.1 使用環境
環境使用:springboot:2.1.3.RELEASE
,springcloud:Greenwich.SR5
1.2 pom文件
<!-- 添加springcloud依賴 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.3 application.properties
########單個服務,爲了預防自己註冊自己#############
#是否將自己註冊到 Eureka-Server 中, 默認的爲 true
eureka.client.registerWithEureka=false
#是否衝 Eureka-Server 中獲取服務註冊信息, 默認爲 true
eureka.client.fetchRegistry=false
1.4 啓動類
@SpringBootApplication
@EnableEurekaServer
public class AppAction {
public static void main(String[] args) {
SpringApplication.run(AppAction.class, args);
}
}
2 集羣部署
2.1 使用環境
在搭建 Eureka
集羣時, 需要添加多個配置文件, 並且使用 SpringBoot
的多環境配置方式。 集羣中需要多少節點就添加多少個配置文件
環境使用:springboot:2.1.3.RELEASE
,springcloud:Greenwich.SR5
2.2 服務端
2.2.1 application.properties
2.2.1.1 服務一配置
# 給應用起一個名字
spring.applicatin.name=eureka-server1
# 端口號
server.port=9090
########在eureka集羣中下面的可以加可以不加,不加的話,就註冊到其他服務了############
######### 加了的話,在eureka服務頁面看不到此服務
######### 不加的話,在eureka服務頁面可以看到此服務
#是否將自己註冊到 Eureka-Server 中, 默認的爲 true
#eureka.client.registerWithEureka=false
#是否衝 Eureka-Server 中獲取服務註冊信息, 默認爲 true
#eureka.client.fetchRegistry=false
#設置 eureka 實例名稱, 與配置文件的變量爲主
eureka.instance.hostname=eureka1
#設置服務註冊中心地址, 指向另一個註冊中心
eureka.client.serviceUrl.defaultZone=http://eureka2:9090/eureka/
#配置日誌
logging.config=classpath:logback.xml
2.2.1.1 服務二配置
# 給應用起一個名字
spring.applicatin.name=eureka-server2
# 端口號
server.port=9090
########在eureka集羣中下面的可以加可以不加,不加的話,就註冊到其他服務了############
#是否將自己註冊到 Eureka-Server 中, 默認的爲 true
#eureka.client.registerWithEureka=false
#是否衝 Eureka-Server 中獲取服務註冊信息, 默認爲 true
#eureka.client.fetchRegistry=false
#設置 eureka 實例名稱, 與配置文件的變量爲主
eureka.instance.hostname=eureka2
#設置服務註冊中心地址, 指向另一個註冊中心
eureka.client.serviceUrl.defaultZone=http://eureka1:9090/eureka/
#配置日誌
logging.config=classpath:logback.xml
2.2.2 logback日誌配置
2.2.2.1 日誌Demo
<?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>
</configuration>
2.2.2.2 日誌文件名bug
報錯信息:catalina.base _is_undefined
catalina.home
指向公用信息的位置,就是bin
和lib
的父目 錄。
catalina.base
指 向每個Tomcat
目錄私有信息的位置,就是conf、logs、temp、webapps和work
的父目錄
有時候會使用一些變量來定義,比如${catalina.base}、${catalina.home}
等。但是,有時候會出來這些變量還沒定義的情況下,會生成一個叫做XXXX _IS_UNDEFINED
的目錄。
爲此可以使用${catalina.base:-.}、${catalina.home:-.}
來代替;
2.2.3 開始集羣部署
2.2.3.1 打包
Maven install
2.2.3.2 編寫啓動腳本
2.2.3.3 設置啓動腳本的運行權限
Chmod 777 server.sh
2.2.3.4 修改linux的 host 文件
vim /etc/hosts
192.168.70.134 eureka1
192.168.70.135 eureka2
2.2.3.5 啓動 eureka 註冊中心
./server.sh start
啓動
./server.sh stop
停止
3 客戶端
無論是provider
還是consumer
對Eureka
而言都是客戶端client
3.1 集羣Provider服務
3.1.1 引入client座標
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.1.2 配置文件
spring.application.name=eureka-collect-provider
server.port=9080
#設置客戶端,指向兩個服務註冊地址
eureka.client.serviceUrl.defaultZone=http://192.168.126.131:9090/eureka/,http://192.168.126.133:9090/eureka/
或者此處不使用直接的ip
地址而是主機名映射的方法如下:
#設置服務註冊中心地址, 指向另一個註冊中心
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
還需要在此路徑C:\Windows\System32\drivers\etc
的hosts
文件添加如下來進行映射:
192.168.70.134 eureka1
192.168.70.135 eureka2
3.1.3 修改啓動類
@EnableEurekaClient
@SpringBootApplication
public class AppAction {
public static void main(String[] args) {
SpringApplication.run(AppAction.class, args);
}
}
3.1.4 編寫服務測試接口
3.1.4.1 實體類
UserPojo.java
public class UserPojo {
private int age;
private String name;
//省去get/set方法,以及有參無慘構造函數
}
3.1.4.2 控制層
@RestController
public class UserController {
@RequestMapping("/hello")
public List<UserPojo> getUsers(){
List<UserPojo> list = new ArrayList<>();
list.add(new UserPojo(1,"張三1"));
list.add(new UserPojo(2,"張三2"));
list.add(new UserPojo(3,"張三3"));
return list;
}
}
3.2 集羣Consumer服務
3.2.1 client座標同Provider
3.2.2 配置文件
spring.application.name=eureka-collect-consumer
server.port=9070
#設置客戶端,指向兩個服務註冊地址
eureka.client.serviceUrl.defaultZone=http://192.168.126.131:9090/eureka/,http://192.168.126.133:9090/eureka/
3.2.3 啓動類的方法同Provider
3.2.4 實體類代碼
3.2.4.1 Serivce層
@Service
public class UserService {
@Autowired
private LoadBalancerClient client;//ribbon負載均衡
public List<UserPojo> getUser(){
//ServiceInstance,是根據服務名字查詢註冊的服務的,封裝了服務的基本信息, 如 IP, 端口
ServiceInstance service = client.choose("eureka-collect-provider");
StringBuffer ip = new StringBuffer();
//http://localhost:9080/hello
ip.append("http://").append(service.getHost()).append(":").
append(service.getPort()).append("/hello");
RestTemplate rt = new RestTemplate();
//返回類型
ParameterizedTypeReference<List<UserPojo>> type = new ParameterizedTypeReference<List<UserPojo>>(){};
//ResponseEntity:封裝返回類型
ResponseEntity<List<UserPojo>> response = rt.exchange(ip.toString(),HttpMethod.GET,null,type);
HttpStatus statusCode = response.getStatusCode();
//httpstatus只是一個枚舉類
return response.getBody();
}
}
3.2.4.2 Controller層
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/hello")
public List<UserPojo> getUsers(){
return userService.getUser();
}
}
3.3 在eureka服務註冊頁面的服務
3.4 修改註冊頁面中hostname註冊爲ip註冊
如下圖註冊就爲hostname
註冊,而不是通過ip
註冊
在客戶端的配置文件application.properties
中添加如下修改:
#表示是使用ip地址
eureka.instance.prefer-ip-address=true
# springboot2.0之後,取地址用ip-address,之前是用ipAddress
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
在客戶端添加後,界面如下: