1.認識微服務
單體架構耦合度高,不利于後期維護更新,改為分布式架構,将一個大的項目分為幾個獨立的功能子產品,每個子產品成為一個服務,功能子產品之間有調用關系。
使用RestTemplate(SpringMVC中的)進行遠端調用,需要知道那個子產品的功能的URL位址,消費者和生産者:隻是一個概念,在一次遠端調用中,調用者也叫消費者,遠端調用其他服務,被調用服務稱為生産者。
2.Eureka注冊中心
Eureka:遠端調用中使用了寫死,耦合度高,引入了一個服務注冊中心的概念。Eukera是服務注冊中心,是一個獨立的微服務。
2.1服務搭建
a.導入eureka依賴(父子產品中)。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
b.啟動類上加@EnableEuekaServer注解,開啟eureka。
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
c.配置檔案添加服務注冊位址。注意服務名稱(要改)
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
啟動微服務,然後在浏覽器通路http://127.0.0.1:10086 就可以了。
2.2服務注冊(将服務注冊到注冊中心)
a.導入依賴(服務提供者中)。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
b.在配置檔案中添加服務名稱、eureka位址。
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
2.3服務發現
a.導入依賴(服務消費者中)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
b.配置檔案添加服務名稱,eureka位址
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
c.服務拉取和負載均衡,在消費者的啟動類中,給RestTemplate這個Bean添加一個@LoadBalance注解,此時就可以通過修改消費者中通路的url路徑,用服務代替ip、端口。
3.ribbon負載均衡
- 攔截我們的RestTemplate請求http://userservice/user/1
- RibbonLoadBalancerClient會從請求url中擷取服務名稱,也就是服務提供者。
- DynamicServerListLoadBalancer根據服務提供者到eureka拉取服務清單
- eureka傳回清單,localhost:8081、localhost:8082
- IRule利用内置負載均衡規則,從清單中選擇一個,例如localhost:8081
- RibbonLoadBalancerClient修改請求位址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,發起真實請求
3.1.負載均衡政策
負載均衡的規則都定義在IRule接口中,而IRule有很多不同的實作類:
預設實作的是ZoneAvoidanceRule,是一種輪詢方案。
3.2.自定義負載均衡政策
通過定義IRule實作可以修改負載均衡規則,有兩種方式:
代碼方式:在消費者的啟動類中定義一個新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule();
}
或者
配置檔案方式:在消費者配置檔案中,添加新的配置可以修改規則
userservice: # 給某個微服務配置負載均衡規則,這裡是userservice服務
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規則
3.3饑餓加載
Ribbon預設是采用懶加載,即第一次通路時才會去建立LoadBalanceClient,請求時間會很長。
而饑餓加載則會在項目啟動時建立,降低第一次通路的耗時,通過下面配置開啟饑餓加載:
ribbon:
eager-load:
enabled: true
clients: userservice
4.Nacos注冊中心
Nacos是SpringCloudAlibaba的元件,而SpringCloudAlibaba也遵循SpringCloud中定義的服務注冊、服務發現規範。是以使用Nacos和使用Eureka對于微服務來說,并沒有太大差別。
主要差異在于:a.依賴不同 b. 服務位址不同
a.引入依賴(父工程)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
b.在消費者和提供者中加入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
c.在消費者和提供者中配置nacos位址
spring:
cloud:
nacos:
server-addr: localhost:8848
注意:一個服務不能出現兩個注冊中心,是以我們要将前面Eureka的依賴全部注釋掉,否則會報錯。