綜合使用spring cloud技術實現微服務應用

  • cloud-config-server:配置服務器
  • cloud-eureka-server:eureka註冊服務器
  • cloud-simple-service:一個使用mybatis的數據庫應用,服務端
  • cloud-simple-ui:webui客戶端

  咱們先來看看如何實現webui客戶端。在spring boot中,已經不推薦使用jsp,因此你若是使用jsp來實現webui端,將會很麻煩。這可能跟如今的開發主流偏重移動端有關,跟微服務有關,跟整個時代當前的技術需求有關。單純以html來做爲客戶端,有不少好處,好比更利於使用高速緩存;使後臺服務無狀態話,更利於處理高併發;更利於頁面做爲服務,小服務組合成大服務等。html

  咱們首選來建立webui應用,參考git cloud-simple-ui工程:前端

   

         這個應用包括前端html頁面,還包括一個後臺controller淺層。這是一個前端應用,爲何要包括controller淺層?這是由於這個controller淺層是用來作服務組合的,由於一個頁面可能涉及到調用多個服務,而這些服務又有可能涉及事務和併發問題,因此仍是須要靠java來完成。固然,也能夠單獨編寫一個api gateway來實現這一層,可使用go、node.js語言等,也可使用java/netty(主流仍是java,由於開發部署效率高)。java

       Controller層的WebApplication就是這個應用的入口,代碼以下:node

  @SpringBootApplicationgit

  @EnableEurekaClientweb

  @EnableHystrixspring

  public class WebApplication {數據庫

         public static void main(String[] args) throws Exception {bootstrap

               SpringApplication.run(WebApplication.class, args);api

    }

  }

  這些註解大都在前面提到過用法:

  @SpringBootApplication至關於@Configuration、@EnableAutoConfiguration、@ComponentScan三個註解合用。

  @EnableEurekaClient配置本應用將使用服務註冊和服務發現,注意:註冊和發現用這一個註解。

  @EnableHystrix表示啓用斷路器,斷路器依賴於服務註冊和發現。

  Controller層的service包封裝了服務接口訪問,UserService類代碼以下:

  @Service

  public class UserService {

          @Autowired

    RestTemplate restTemplate; 

    final String SERVICE_NAME="cloud-simple-service";        

     @HystrixCommand(fallbackMethod = "fallbackSearchAll")

    public List<User> searchAll() {

      return restTemplate.getForObject("http://"+SERVICE_NAME+"/user", List.class);

    }   

    private List<User> fallbackSearchAll() {

               System.out.println("HystrixCommand fallbackMethod handle!");

               List<User> ls = new ArrayList<User>();

               User user = new User();

               user.setUsername("TestHystrix");

               ls.add(user);

               return ls;

    }

  }

  這裏使用了斷路器,就是@HystrixCommand註解。斷路器的基本做用就是@HystrixCommand註解的方法失敗後,系統將自動切換到fallbackMethod方法執行。斷路器Hystrix具有回退機制、請求緩存和請求打包以及監控和配置等功能,在這裏咱們只是使用了它的核心功能:回退機制,使用該功能容許你快速失敗並迅速恢復或者回退並優雅降級。

  這裏使用restTemplate進行服務調用,由於使用了服務註冊和發現,因此咱們只須要傳入服務名稱SERVICE_NAME做爲url的根路徑,如此restTemplate就會去EurekaServer查找服務名稱所表明的服務並調用。而這個服務名稱就是在服務提供端cloud-simple-service中spring.application.name所配置的名字,這個名字在服務啓動時連同它的IP和端口號都註冊到了EurekaServer。

  封裝好服務調用後,你只須要在Controller類裏面注入這個服務便可:

  @RestController

  public class UserController {       

       @Autowired

       UserService userService;      

       @RequestMapping(value="/users")

       public ResponseEntity<List<User>> readUserInfo(){

              List<User> users=userService.searchAll();         

              return new ResponseEntity<List<User>>(users,HttpStatus.OK);

       }

  }

  至此這個webui應用的java端就開發完了,咱們再來看頁面模塊。

  能夠看到,頁面文件都放在resources\static目錄下面,這是spring boot默認的頁面文件主文件夾,你若是在裏面放一個index.html,那麼直接訪問根路徑http://localhost:8080/會直接定位到這個頁面。因此這個static就至關於傳統web項目裏面的webapp文件夾。

  在這裏包括兩個頁面index.html和user-page.html,用戶訪問首頁時將會加載user-page.html子頁面。

  首頁index.html頁面核心代碼以下:

  <html ng-app="users">

  <head>   

    <script src="js/app.js"></script>

  </head>

  <body>

  <div ng-view class="container">

  </div>

  </body>

  </html>

  頁面user-page.html代碼以下:

  <div>

  <ul ng-controller="userCtr">

    <li ng-repeat="item in userList">

  {{item.username}}   

  </li>

  </ul>

  </div>

  app.js頁面代碼以下:

  angular.module('users', ['ngRoute']).config(function ($routeProvider) {

  $routeProvider.when('/', {

        templateUrl: 'user-page.html',

        controller: 'userCtr'

  })

  }).controller('userCtr', function ($scope, $http) {

  $http.get('users').success(function (data) {

           //alert(data+"");

        $scope.userList = data;

  });

  });

  這裏使用了angularJS庫。Angular能夠綁定模型數據到頁面變量,在user-page.html看到的{{item.username}}就是它的綁定語法,這個語法根jsp或freemarker這些模板技術都相似,只不過Angular是用在客戶端的,而前者是用在服務端的。

  至此這個webui應用就開發完了,改一下配置文件和pom文件就能夠運行了。配置文件包括配置管理服務器地址,註冊服務器地址等,在bootstrap.properties文件中:

  spring.cloud.config.uri=http://127.0.0.1:${config.port:8888}

  spring.cloud.config.name=cloud-config

  spring.cloud.config.profile=${config.profile:dev}

  eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/

  spring.application.name=simple-ui-phone

  這些配置咱們在上一章已經提到過了,這裏再也不解釋。由於使用了斷路器,因此相比上一章的cloud-simple-service項目,須要加入hystrix依賴,只有一個starter依賴:

  <dependency>

    <groupId>org.springframework.cloud</groupId>

  <artifactId>spring-cloud-starter-hystrix</artifactId>

  </dependency>

  Spring把事情作的如此簡單,無論是服務註冊仍是斷路器,連同註解加配置文件再加上依賴總共不超過十行代碼。如此簡單就可使用一個分佈式應用,也難怪國內外業內人員都高度重視這個框架,在簡單和速度就是硬道理的今天,這個框架有着重要的意義。

   剩下最重要的事情就是進行部署了,咱們以此使用命令啓動這些服務及應用:

  1)  java -jar cloud-config-server-0.0.1.jar,啓動配置服務器,固定綁定端口8888;

  2)  java -jar cloud-eureka-server-1.0.0.jar,啓動註冊服務器,固定綁定端口8671;

  3)  java -jar cloud-simple-service-1.0.0.jar --server.port=8081 >log8081.log,啓動後臺服務,綁定端口8081

  4)  java -jar cloud-simple-service-1.0.0.jar --server.port=8082 >log8082.log,啓動後臺服務,綁定端口8082

  5)  java -jar cloud-simple-ui-1.0.0.jar --server.port=8080 >log8080.log,啓動前端ui應用,綁定端口8080

  運行http://localhost:8080/便可看到運行的結果。其中「>log8080.log」表示輸出日誌到文件。

  這裏運行了兩個cloud-simple-service實例,主要是爲了演示ribbon負載均衡。默認狀況下使用ribbon不須要再做任何配置,不過它依賴於註冊服務器。固然也能夠對ribbon進行一些自定義設置,好比配置它的超時時間、重試次數等。啓用了負載均衡後,當咱們關掉前端頁面上次指向的服務時(從日誌中看),好比咱們刷新頁面看到它調用的是8081服務,那麼咱們關掉這個服務。關掉後再刷新會發現執行了斷路器,過幾秒再刷新,它已經切換到了8082這臺服務器,這說明負載均衡起做用了。

 
分類:  spring cloud
相關文章
相關標籤/搜索