一. Spring之微服務
1.微服務架構的基礎框架、組件
- 服務注冊發現
- 服務網關
- 后端通用服務
- 前端服務 又稱為邊緣服務
2.兩大配方
Dubbo
Zookeeper
SpringMVC or spirngboot
Spring Cloud:
Spring cloud Netflix eureka
Spring boot
3.Spring Cloud是什么
是一個開發工具集,含了多個子項目
主要是基於NETFLIX開源組件的進一步封裝
簡化了分布式開發
掌握如何使用,更要理解分布式,架構的特點
4.spring cloud eureka
基於netflix eureka做了二次封裝
兩個組件組成:
Eureka server注冊中心
Eureka client 服務注冊
5.注冊中心實踐
Eureka server (eureka找到了,有了的意思)
@SpringBootApplication
@EnableEurekaServer
public class Eureka002Application {
public static void main(String[] args) {
SpringApplication.run(Eureka002Application.class, args);
}
}
在服務主程序中加上:EnableEurekaServer
創建服務:
啟動后:
Cannot execute request on any known server
說明當前沒有服務注冊
打開控制台:
http://localhost:8080/
設置后可以注冊自憶
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka #注冊服務地址
register-with-eureka: false #不注冊服務自已
spring:
application:
name: eureka #服務名稱
服務端寫好可以打包JAR文件方法如下:
【說明】
- compile是編譯出classes文件
- package是打包發布
- 運行:java –jar xxxxxx.jar
6.客戶端
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaclientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaclientApplication.class, args);
}
}
首無要配制EnableDiscoveryClient然后注冊到哪個注冊中心
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka #注冊服務地址
spring:
application:
name: eureka-client #服務名稱
server:
port: 8081
配制完客戶端即可啟動但是會遇到一個問題:
Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'eurekaInstanceConfigBean': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
怎么解決呢:
這是因為client里不包含Tomcat的依賴,所以Spring容器無法創建一些實例,從而導致項目無法啟動,只需在pom.xml文件中,加上web依賴即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
項目啟動成功后,可以在eureka server的信息面板中查看到已注冊的實例信息
又出現另外一個問題:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
意就是客戶端上線率太低造成,怎么解決呢
在服務端加入:
server:
enable-self-preservation: false #開發時不統計上線率
這時又會出現:
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
這個沒關系就是說在生產環境中不可以關閉這個,只能在生產環境中關閉
7.高可用性
實現互相注冊
下面開始模擬:
先復制一個服務端:
分別命名01,02
選啟動第一台,注冊到第二台上:8762
啟動
然后選擇第二個注冊到第一個上需要修改yml配制文件的端口
同樣方法:
此時啟動客戶端:
先注冊到任一台上測試,見證奇跡的時刻到了:
客戶端啟是注冊到第一台上的:
第二台同時也出現了:
這時雖然注冊了一個但是服務端會自動同步到第二台上所以第二台可以看到
這個雖然可以同步,但是會有問題就是第一台掛了,雖然第二台可以用,但是如果重啟了第二台,就無法注冊到第二台了。怎么做呢?
方法:
每次客戶端向二台服務器中同時注冊就可以了。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka #注冊服務地址
