天天看點

SpringCloud基礎篇1.認識微服務2.Eureka注冊中心 3.ribbon負載均衡4.Nacos注冊中心

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、端口。

SpringCloud基礎篇1.認識微服務2.Eureka注冊中心 3.ribbon負載均衡4.Nacos注冊中心

 3.ribbon負載均衡

SpringCloud基礎篇1.認識微服務2.Eureka注冊中心 3.ribbon負載均衡4.Nacos注冊中心
  • 攔截我們的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有很多不同的實作類:

SpringCloud基礎篇1.認識微服務2.Eureka注冊中心 3.ribbon負載均衡4.Nacos注冊中心

 預設實作的是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的依賴全部注釋掉,否則會報錯。