咱們先來看看如何實現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這臺服務器,這說明負載均衡起做用了。