一、概念
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)十年經(jīng)驗成就非凡,專業(yè)從事成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè),成都網(wǎng)頁設(shè)計,成都網(wǎng)頁制作,軟文發(fā)布平臺,1元廣告等。十年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:13518219792,我們期待您的來電!
基于springboot基礎(chǔ)上用于快速構(gòu)建分布式系統(tǒng)的通用模式的工具集。
二、特點
1、約定優(yōu)于配置;
2、隱藏組件復(fù)雜性;
3、輕量級組件;
4、組件豐富,功能齊全,例如:服務(wù)發(fā)現(xiàn)、斷路器、微服務(wù)網(wǎng)關(guān)等;
5、選型中立、豐富;
6、靈活。
三、服務(wù)消費者與服務(wù)提供者
在微服務(wù)架構(gòu)中有兩種角色:服務(wù)消費者與服務(wù)提供者,二者關(guān)系如下:
服務(wù)提供者:服務(wù)的被調(diào)用者
服務(wù)消費者:服務(wù)的調(diào)用者
例如,在電影系統(tǒng)中,用戶購買電影票票之前,電影服務(wù)需要調(diào)用用戶服務(wù)的接口獲取用戶信息,此時的電影服務(wù)就是調(diào)用方,即服務(wù)消費者,用戶服務(wù)為被調(diào)用方,即服務(wù)提供者。
四、微服務(wù)實踐
1、服務(wù)提供者:用戶服務(wù)
項目結(jié)構(gòu)如下:
這個demo主要是為了演示服務(wù)與服務(wù)之間的通信,因此不再配置數(shù)據(jù)源。
User.java
package?com.my.user.entity; import?lombok.Data; /** ?*?@author?垃圾美少女 ?*/ @Data public?class?User?{ ????private?Integer?id; ????private?String?name; ????private?Integer?age; ????private?String?username; ????private?Integer?balance; }
IUserService.java
package?com.my.user.service; import?com.my.user.entity.User; /** ?*?@author?垃圾美少女 ?*/ public?interface?IUserService?{ ????User?getByUserId(Integer?userId); }
UserServiceImpl.java
package?com.my.user.service.impl; import?com.my.user.entity.User; import?com.my.user.service.IUserService; import?org.springframework.stereotype.Service; import?java.util.ArrayList; import?java.util.List; import?java.util.Objects; import?java.util.stream.Collectors; /** ?*?@author?垃圾美少女 ?*/ @Service public?class?UserServiceImpl?implements?IUserService?{ ????@Override ????public?User?getByUserId(Integer?userId)?{ ????????List<User>?userList?=?getUserList(); ????????userList?=?userList.stream() ????????????????.filter(user?->?Objects.equals(user.getId(),?userId)) ????????????????.collect(Collectors.toList()); ????????if?(userList?!=?null?&&?userList.size()?>?0)?{ ????????????return?userList.get(0); ????????} ????????return?null; ????} ????/** ?????*?由于沒有配置數(shù)據(jù)源,在此設(shè)置虛擬數(shù)據(jù) ?????* ?????*?@return?list ????*/ ????private?List<User>?getUserList()?{ ????????List<User>?list?=?new?ArrayList<>(5); ????????for?(int?i?=?0;?i?<?5;?i++)?{ ????????????User?user?=?new?User(); ????????????user.setAge(12?+?1); ????????????user.setId(1?+?i); ????????????user.setName("用戶"?+?i); ????????????user.setUsername("用戶名"?+?i); ????????????user.setBalance(123?+?i); ????????????list.add(user); ????????} ????????return?list; ????} }
UserController.java
package?com.my.user.controller; import?com.my.user.Util.ReturnUtil; import?com.my.user.entity.User; import?com.my.user.service.IUserService; import?lombok.extern.slf4j.Slf4j; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; import?org.springframework.web.bind.annotation.RestController; import?java.util.Map; /** ?*?@author?垃圾美少女 ?*/ @RestController @Slf4j public?class?UserController?{ ????@Autowired ????private?IUserService?userService; ????/** ?????*?根據(jù)id獲取用戶信息 ?????* ?????*?@param?userId?用戶id ?????*?@return?map ?????*/ ????@RequestMapping(value?=?"/user/getUserInfo",?method?=?RequestMethod.GET) ????public?Map?getUserInfo(Integer?userId)?{ ????????try?{ ????????????log.info("/user/getUserInfo被訪問,參數(shù):userId="?+?userId); ????????????User?user?=?userService.getByUserId(userId); ????????????return?ReturnUtil.succe***esult(user,?"獲取成功"); ????????}?catch?(Exception?e)?{ ????????????log.error(e.getMessage(),?e); ????????????return?ReturnUtil.errorResult(null,?"獲取失敗"); ????????} ????} }
ReturnUtil.java
package?com.my.user.Util; import?java.util.HashMap; import?java.util.Map; /** ?*?@author?垃圾美少女 ?*/ public?class?ReturnUtil?{ ????public?static?Map?succe***esult(Object?data,?String?msg)?{ ????????Map<String,?Object>?map?=?new?HashMap<>(3); ????????map.put("code",?1); ????????map.put("msg",?msg); ????????map.put("data",?data); ????????return?map; ????} ????public?static?Map?errorResult(Object?data,?String?msg)?{ ????????Map<String,?Object>?map?=?new?HashMap<>(3); ????????map.put("code",?-1); ????????map.put("msg",?msg); ????????map.put("data",?data); ????????return?map; ????} }
application.yml
server: ??port:?8010?#指定端口為??8010
啟動項目后訪問:http://localhost:8010/user/getUserInfo?userId=1
得到相應(yīng):
{ ????"msg":?"獲取成功", ????"data":?{ ????????"id":?1, ????????"name":?"用戶0", ????????"age":?13, ????????"username":?"用戶名0", ????????"balance":?123 ????}, ????"code":?1 }
表示接口已通。
2、服務(wù)消費者:電影服務(wù)
項目架構(gòu)如下:
User.java和ReturnUtil.java與上例相同在此不再展示。
MovieApplicaiton.java
package?com.my.movie; import?org.springframework.boot.SpringApplication; import?org.springframework.boot.autoconfigure.SpringBootApplication; import?org.springframework.context.annotation.Bean; import?org.springframework.web.client.RestTemplate; @SpringBootApplication public?class?MovieApplication?{ ????@Bean ????public?RestTemplate?restTemplate()?{ ????????return?new?RestTemplate(); ????} ????public?static?void?main(String[]?args)?{ ????????SpringApplication.run(MovieApplication.class,?args); ????} }
MovieController.java
package?com.my.movie.controller; import?lombok.extern.slf4j.Slf4j; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.http.ResponseEntity; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; import?org.springframework.web.bind.annotation.RestController; import?org.springframework.web.client.RestTemplate; import?java.util.HashMap; import?java.util.Map; /** ?*?@author?垃圾美少女 ?*/ @RestController @Slf4j public?class?MovieController?{ ????@Autowired ????private?RestTemplate?restTemplate; ????@RequestMapping(value?=?"/movie/findById",?method?=?RequestMethod.GET) ????public?Map?findById(Integer?userId)?{ ????????log.info("/movie/findById被訪問,參數(shù):userId="?+?userId); ????????ResponseEntity<HashMap>?forEntity?= ????????????????this.restTemplate.getForEntity("http://localhost:8010/user/getUserInfo?userId="?+?userId,?HashMap.class); ????????return?forEntity.getBody(); ????} }
application.yml
server: ??port:?8020
此時啟動項目,訪問:http://localhost:8020/movie/findById?userId=1
得到響應(yīng):
{ ????"msg":?"獲取成功", ????"code":?1, ????"data":?{ ????????"id":?1, ????????"name":?"用戶0", ????????"age":?13, ????????"username":?"用戶名0", ????????"balance":?123 ????} }
至此,一個簡單的電影微服務(wù)就完成了。
五、上述例子中存在的問題
1、在代碼中寫死訪問路徑
在電影服務(wù)中,可以將user服務(wù)的訪問路徑寫到y(tǒng)ml配置文件中,使代碼更清爽:
yml:
server: ??port:?8020 userService: ??domain:?http://localhost:8010/user/ ??getUserByIdUrl:?http://localhost:8010/user/getUserInfo?userId=
MovieController.java
package?com.my.movie.controller; import?lombok.extern.slf4j.Slf4j; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.beans.factory.annotation.Value; import?org.springframework.http.ResponseEntity; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; import?org.springframework.web.bind.annotation.RestController; import?org.springframework.web.client.RestTemplate; import?java.util.HashMap; import?java.util.Map; /** ?*?@author?垃圾美少女 ?*/ @RestController @Slf4j public?class?MovieController?{ ????@Autowired ????private?RestTemplate?restTemplate; ????@Value("${userService.domain}") ????private?String?userServiceDomain; ????@Value("${userService.getUserByIdUrl}") ????private?String?findByUserIdUrl; ????@RequestMapping(value?=?"/movie/findById",?method?=?RequestMethod.GET) ????public?Map?findById(Integer?userId)?{ ????????log.info("/movie/findById被訪問,參數(shù):userId="?+?userId); ????????ResponseEntity<HashMap>?forEntity?= ????????????????this.restTemplate.getForEntity(findByUserIdUrl?+?userId,?HashMap.class); ????????return?forEntity.getBody(); ????} }
2、適用場景有限:當(dāng)用戶服務(wù)的地址或端口號發(fā)生改變時,需要修改電影服務(wù)的配置文件并且重新部署,這顯然是不可取的。
文章標(biāo)題:springCloud入門學(xué)習(xí)(二):認(rèn)識springcloud
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article42/jddphc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、搜索引擎優(yōu)化、企業(yè)建站、網(wǎng)站制作、軟件開發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)