1. 程式人生 > >springcloud超簡單的入門2--Eureka服務治理

springcloud超簡單的入門2--Eureka服務治理

Eureka服務治理

下面請聽第一個話題,母。。。咳咳,拿錯書了。

Eureka簡介

eureka是什麼呢?

簡單來說呢,當我的微服務應用多了起來,一個一個寫死再程式裡是件很不優雅的事情,而且同一服務可能會多個例項存在,來對服務分流,就是負載均衡。

所以,我們需要一個位置來存放服務的訪問列表,以供消費端來使用,這個東西呢,就可以用eureka來實現。

我們來看一下eureka的相關概念:

  • ​ 相關概念

    • 服務註冊(Register)

      eureka客戶端向Eureka伺服器註冊時,它提供自身的元資料,比如IP地址,埠資訊

    • 服務續約(Renew)

      客戶端每隔30秒傳送一次心跳來進行服務續約。

    • 服務下線(Cancel)

      客戶端在程式關閉時向伺服器傳送取消請求,成功該例項將會從伺服器註冊列表中刪除

    • 服務剔除(Eviction)

      預設情況下,當客戶端連續90秒沒有傳送心跳請求,伺服器就會將該服務例項從服務列表中刪除,剔除該服務

    • 獲取服務註冊列表資訊(Fetch Registriers)

      客戶端從伺服器獲取服務註冊列表資訊,並將其快取在本地。列表資訊定期(30秒)更新一次。

不太理解也沒關係,我們可以先把架子搭建起來,之後慢慢悟把。

Eureka角色

Eureka中存在三種角色,註冊中心,服務提供者,服務消費者。

其中註冊中心是Eureka服務端,服務提供者與服務消費者都是客戶端。

  • 註冊中心伺服器

    主要進行,服務註冊,服務續約和服務下線。就是維護服務列表的東東啦。

    讓我們一步一步的開始把

    • 相關依賴
    <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    • 啟動類配置,使用@EnableEurekaServer註解,啟用Eureka服務
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekacenteralApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekacenteralApplication.class, args);
        }
    
    }
    • 屬性配置
    server:
      port: 9090 ##UI介面埠
    eureka:
      instance:
        hostname: localhost  ##主機名稱
      client:
        register-with-eureka: false  ##是否註冊到服務中心,因為本身就是服務中心,不需要註冊
        fetch-registry: false  ##是否發現服務
        service-url:          ##註冊中心服務地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

    啟動服務,這樣一個簡單的註冊中心就啟動起來,瀏覽器訪問http://localhost:9090 就可以看到eureka的監控介面了。

  • 服務提供者

    eureka客戶端,向外提供服務

    • 相關依賴,作為Euraka客戶端
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     </dependency>
    • 啟動類配置,使用@EnableEurekaClient註解,啟動Eureka客戶端
    @SpringBootApplication
    @EnableEurekaClient
    public class App {
        public static void main(String[] args) {
            SpringApplication.run(App.class,args);
        }
    }
    • 屬性配置(單機時可以通過設定不同埠,來啟動多個服務)
    server:
      port: 8080
    eureka:
      instance:
        prefer-ip-address: true  ##使用IP註冊服務
      client:
        register-with-eureka: true  #預設就是true,可以不用設定
        fetch-registry: true  #預設是true,可以不用設定
        service-url:
          defaultZone: http://localhost:9090/eureka/
    spring:
      application:
        name: microservice-provider
    • 服務介面
    @RestController
    @RequestMapping("/")
    public class TestController {
    
        @GetMapping("hi/{name}")
        public String hi(@PathVariable String name, HttpServletRequest request){
            try {
                Thread.sleep(2010);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "hi,welcome "+name+" from port:"+request.getServerPort();
        }
    }
  • 服務消費者

    本質上與提供者為同一類客戶端,會在本地快取一份服務列表資訊,會定期更新快取

    • 相關依賴
    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    • 啟動類配置
    @SpringBootApplication
    public class App {
    
        public static void main(String[] args) {
            SpringApplication.run(App.class,args);
        }
        @Bean
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    • 屬性配置
    server:
      port: 8090
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:9090/eureka/
        register-with-eureka: false ##僅僅作為消費者
        fetch-registry: true  #預設是true,可以不用設定
    
      ## 多說幾句,服務者跟消費者不是絕對的,他們可以同時作為兩種角色存在
      ## register-with-eureka: true
      ## fetch-registry: true  
      ## 當這兩個熟悉都為true的時候,就可以作為兩種角色同時存在了,即可以作為提供者,向外提供服務
      ## 又可以作為消費者,消費服務
    • 服務消費,都在程式碼裡,我幹了,你隨意。
    @RestController
    @RequestMapping("/")
    public class TestController {
    
    
        // 服務只有一個例項執行的時候,一個服務提供者,
        // 就算不註冊到eureka,我們也可以使用這種方式就行呼叫
        @Resource
        RestTemplate restTemplate;
        @GetMapping("hi")
        public String hi() {
            return restTemplate.getForObject("http://localhost:8090/hi/consumer", String.class);
        }
    
        //當服務有多個例項的時候,我們就可以使用服務發現或獲取服務列表,並取其中一個例項進行呼叫
        // 這樣才是實際場景,當然還用更簡潔的使用方式,我們下次說
        @Resource
        DiscoveryClient discoveryClient;
        //通過服務發現,獲取註冊中心上註冊的服務,獲取呼叫地址,然後呼叫服務
        @GetMapping("hi2")
        public String hi2() {
            List<ServiceInstance> serviceInstances = discoveryClient
                    .getInstances("microservice-provider");
            if (serviceInstances.size() == 0) return "service has down";
            // 這裡就是取第一個服務來消費
            return restTemplate.getForObject(String.format("%s/hi/consumer", serviceInstances.get(0).getUri()),
                    String.class);
        }
    }