Eureka的單服務Demo和集羣部署Demo

1 單服務Demo

1.1 使用環境

環境使用:springboot:2.1.3.RELEASEspringcloud: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.RELEASEspringcloud: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指向公用信息的位置,就是binlib的父目 錄。
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 編寫啓動腳本

Springcloud配置文件詳解

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還是consumerEureka而言都是客戶端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\etchosts文件添加如下來進行映射:

  • 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}

在客戶端添加後,界面如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章