springCloud入門(mén)學(xué)習(xí)(二):認(rèn)識(shí)springcloud

一、概念

成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)十年經(jīng)驗(yàn)成就非凡,專(zhuān)業(yè)從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),成都網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)頁(yè)制作,軟文發(fā)布平臺(tái)1元廣告等。十年來(lái)已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:13518219792,我們期待您的來(lái)電!

基于springboot基礎(chǔ)上用于快速構(gòu)建分布式系統(tǒng)的通用模式的工具集。

二、特點(diǎn)

1、約定優(yōu)于配置;

2、隱藏組件復(fù)雜性;

3、輕量級(jí)組件;

4、組件豐富,功能齊全,例如:服務(wù)發(fā)現(xiàn)、斷路器、微服務(wù)網(wǎng)關(guān)等;

5、選型中立、豐富;

6、靈活。

三、服務(wù)消費(fèi)者與服務(wù)提供者

在微服務(wù)架構(gòu)中有兩種角色:服務(wù)消費(fèi)者與服務(wù)提供者,二者關(guān)系如下:

服務(wù)提供者:服務(wù)的被調(diào)用者

服務(wù)消費(fèi)者:服務(wù)的調(diào)用者

例如,在電影系統(tǒng)中,用戶購(gòu)買(mǎi)電影票票之前,電影服務(wù)需要調(diào)用用戶服務(wù)的接口獲取用戶信息,此時(shí)的電影服務(wù)就是調(diào)用方,即服務(wù)消費(fèi)者,用戶服務(wù)為被調(diào)用方,即服務(wù)提供者。

四、微服務(wù)實(shí)踐

1、服務(wù)提供者:用戶服務(wù)

項(xiàng)目結(jié)構(gòu)如下:

springCloud入門(mén)學(xué)習(xí)(二):認(rèn)識(shí)springcloud

這個(gè)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;
????}

????/**
?????*?由于沒(méi)有配置數(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被訪問(wèn),參數(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

啟動(dòng)項(xiàng)目后訪問(wèn):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ù)消費(fèi)者:電影服務(wù)

項(xiàng)目架構(gòu)如下:

springCloud入門(mén)學(xué)習(xí)(二):認(rèn)識(shí)springcloud

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被訪問(wèn),參數(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

此時(shí)啟動(dòng)項(xiàng)目,訪問(wèn):http://localhost:8020/movie/findById?userId=1

得到響應(yīng):

{
????"msg":?"獲取成功",
????"code":?1,
????"data":?{
????????"id":?1,
????????"name":?"用戶0",
????????"age":?13,
????????"username":?"用戶名0",
????????"balance":?123
????}
}

至此,一個(gè)簡(jiǎn)單的電影微服務(wù)就完成了。

五、上述例子中存在的問(wèn)題

1、在代碼中寫(xiě)死訪問(wèn)路徑

在電影服務(wù)中,可以將user服務(wù)的訪問(wèn)路徑寫(xiě)到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被訪問(wèn),參數(shù):userId="?+?userId);
????????ResponseEntity<HashMap>?forEntity?=
????????????????this.restTemplate.getForEntity(findByUserIdUrl?+?userId,?HashMap.class);
????????return?forEntity.getBody();

????}

}

2、適用場(chǎng)景有限:當(dāng)用戶服務(wù)的地址或端口號(hào)發(fā)生改變時(shí),需要修改電影服務(wù)的配置文件并且重新部署,這顯然是不可取的。

文章標(biāo)題:springCloud入門(mén)學(xué)習(xí)(二):認(rèn)識(shí)springcloud
當(dāng)前網(wǎng)址:http://bm7419.com/article42/jddphc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、搜索引擎優(yōu)化企業(yè)建站、網(wǎng)站制作軟件開(kāi)發(fā)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)