??前言
本篇博文是關(guān)于Spring Cloud–從零開始搭建微服務(wù)基礎(chǔ)環(huán)境【三】,希望你能夠喜歡
??個人主頁:晨犀主頁
??個人簡介:大家好,我是晨犀,希望我的文章可以幫助到大家,您的滿意是我的動力????
??歡迎大家:這里是CSDN,我總結(jié)知識的地方,歡迎來到我的博客,感謝大家的觀看??
如果文章有什么需要改進的地方還請大佬不吝賜教 先在此感謝啦??
微服務(wù)基礎(chǔ)環(huán)境搭建
創(chuàng)建使用會員微服務(wù)模塊-service consumer
需求說明/圖解
示意圖
-瀏覽器: http://localhost/member/consumer/get/1
測試添加會員: http://localhost/member/consumer/save
思路分析/圖解
1、創(chuàng)建Moduel(member-service-consumer-80) & 完成配置
2、創(chuàng)建controller
3、完成測試
實現(xiàn)步驟
創(chuàng)建Moduel & 完成配置
創(chuàng)建member-service-consumer-80 微服務(wù)模塊[使用會員服務(wù)]
由于創(chuàng)建模塊步驟一致,這里不做描述。
創(chuàng)建模塊完成后,父工程的pom.xml-會做相應(yīng)變化,管理member-service-consumer-80 微服務(wù)子模塊
修改member-service-consumer-80 的pom.xml , 加入相關(guān)依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>e-commerce-center</artifactId>
<groupId>com.my.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>member-service-consumer-80</artifactId>
<!--引入相關(guān)的依賴: 我們引入了當(dāng)前需要的依賴,后面如果有其它需要,再靈活調(diào)整-->
<dependencies>
<!--引入sleuth + zipkin 依賴 說明 1. 使用的是版本仲裁 2.starter-zipkin包含了sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--引入eureka client 場景啟動器starter-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--引入web-starter 說明我們使用版本仲裁(從父項目繼承了版本)
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--說明:starter-actuator 是springboot程序的監(jiān)控系統(tǒng), 可以實現(xiàn)系統(tǒng)的健康檢測
可以通過http://localhost:10000/actuator 看到相關(guān)的連接,和信息
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入e_commerce_center-common-api-->
<dependency>
<groupId>com.my.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
創(chuàng)建resources/application.yml
server:
port: 80
創(chuàng)建主啟動類com/my/springcloud/MemberConsumerApplication.java
@SpringBootApplication
public class MemberConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerApplication.class,args);
}
}
業(yè)務(wù)實現(xiàn)
創(chuàng)建entity
@AllArgsConstructor
@NoArgsConstructor
@Data
//Serializable 加上,后面可能使用
public class Member implements Serializable {
private Long id;
private String name;
private String pwd;
private String mobile;
private String email;
private Integer gender;
}
創(chuàng)建com/my/springcloud/entity/Result.java
/**
* 1. 用于返回結(jié)果, 利于json 格式
* 2. 這個工具類, 在網(wǎng)上也可找到
*/
public class Result<T> {
private String code;
private String msg;
private T data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Result() {
}
public Result(T data) {
this.data = data;
}
public static Result success() {
Result result = new Result<>();
result.setCode("200");
result.setMsg("success");
return result;
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>(data);
result.setCode("200");
result.setMsg("success");
return result;
}
public static <T> Result<T> success(String msg, T data) {
Result<T> result = new Result<>(data);
result.setCode("200");
result.setMsg(msg);
return result;
}
public static Result error(String code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
public static <T> Result<T> error(String code, String msg, T data) {
Result<T> result = new Result<>(data);
result.setCode(code);
result.setMsg(msg);
return result;
}
}
注入RestTemplate
基本介紹
1、RestTemplate 是Spring 提供的用于訪問Rest 服務(wù)的模板類。
2、RestTemplate 提供了多種便捷訪問遠程Http 服務(wù)的方法。
3、說明:小伙伴可以這樣理解, 通過RestTemplate, 我們可以發(fā)出http 請求(支持Restful 風(fēng)格), 去調(diào)用Controller 提供的API 接口, 就像我們使用瀏覽器發(fā)出http 請求,調(diào)用該API 接口一樣。
4、使用簡單便捷。
官網(wǎng)及使用
官網(wǎng)地址:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
創(chuàng)建配置類: com/my/springcloud/config/CustomizationBean.java
@Configuration
public class CustomizationBean {
//說明: 配置注入RestTemplate bean/對象
//這里的@LoadBalanced 就是賦予 RestTemplate 負載均衡的能力
//默認是使用輪詢算法來訪問遠程調(diào)用接口/地址
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
Controller
創(chuàng)建:com/my/springcloud/controller/MemberConsumerController.java
@RestController
@Slf4j
public class MemberConsumerController {
//定義member_service_provider_url 這是一個基礎(chǔ)url地址
//使用shift+ctrl+u 進行字母大小寫的切換
/**
* 說明:
* 1. MEMBER-SERVICE-PROVIDER 就是服務(wù)提供方[集群], 注冊到Eureka Server 的名稱
* 2. 也就是服務(wù)提供方[集群]對外暴露的名稱為 MEMBER-SERVICE-PROVIDER
* 3. MEMBER-SERVICE-PROVIDER 目前有 兩個 Availability Zones member-service-provider:10000
* 還有一個 member-service-provider:10002
* 需要增加一個注解@LoadBalanced 賦予 RestTemplate 負載均衡的能力,也就是會根據(jù)你的負載均衡算法
* 來選擇某個服務(wù)去訪問, 默認是輪詢算法, 當(dāng)然我們也可以自己配置負載均衡算法
*/
public static final String MEMBER_SERVICE_PROVIDER_URL =
"http://MEMBER-SERVICE-PROVIDER"; //后面這里地方會修改成提供服務(wù)模塊的注冊別名
//裝配RestTemplate bean/對象
@Resource
private RestTemplate restTemplate;
//方法/接口 添加member對象到數(shù)據(jù)庫/表
//說明: 這還有一個坑, 一會就解決.
@PostMapping("/member/consumer/save")
public Result<Member> save(Member member) {
log.info("service-consumer member={}", member);
//說明
//請的完整的url :MEMBER_SERVICE_PROVIDER_URL + "/member/save" => http://localhost:10000/member/save
//member : 就是通過restTemplate 發(fā)出的post請求攜帶數(shù)據(jù)(對象)
//Result.class: 返回對象類型
//這里通過restTemplate 調(diào)用服務(wù)提供模塊的接口, 就是一個遠程調(diào)用 RPC
return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL
+ "/member/save", member, Result.class);
}
//方法/接口 , 根據(jù)id 調(diào)用服務(wù)接口,返回member對象信息
@GetMapping("/member/consumer/get/{id}")
public Result<Member> getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(
MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id, Result.class);
}
}
完成測試
首先啟動微服務(wù)模塊: member-service-provider-10000 和member-service-consumer-80
瀏覽器: http://localhost/member/consumer/get/1
注意事項和使用細節(jié)
如果member-service-consumer-80 啟動報錯:
springBoot 啟動If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
//加入排除DataSourceAutoConfiguration 自動配置
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MemberConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerApplication.class, args);
}
}
添加會員數(shù)據(jù)庫中為null 的解決方案
通過網(wǎng)絡(luò)發(fā)送相當(dāng)于流的形式,底層會重新變成對象以json形式傳播,不做處理就會添加空。需要通過序列化發(fā)送才能反序列化恢復(fù)
開啟Run DashBoard
什么是Run Dashboard
當(dāng)springcloud 的服務(wù)有多個時,管理多個服務(wù)的啟動使用run 會不好管理,這樣我們就可以使用Run Dashboard。
如圖
新版的2020 的IDEA 當(dāng)你同時啟動兩個微服務(wù)時,不會彈出啟動Run Dashboard 窗口的提示,是因為IDEA2020 將Run Dashboard 添加到控制臺Service 中
開啟Run Daahboard/Service 的步驟
- 找到你的項目/.idea/workspace.xml 文件在其中添加下面的代碼即可
- 重新啟動idea2020.2 , 會看到如下界面, 如果沒有看到這個Services, 參考第3 步添加一下即可
- 如果沒有看到這個Services, 添加一下即可
- 啟動你的微服務(wù),就會在Service 面板上看到各個微服務(wù)模塊, 也可以進行管理
提醒: 不同版本的IDEA 開啟Run DashBoard 有區(qū)別,如果和這里IDEA 版本不同,百度下解決。文章來源:http://www.zghlxwxcb.cn/news/detail-699540.html
文章到這里就結(jié)束了,如果有什么疑問的地方請指出,諸大佬們一起來評論區(qū)一起討論??
希望能和諸大佬們一起努力,今后我們一起觀看感謝您的閱讀??
如果幫助到您不妨3連支持一下,創(chuàng)造不易您們的支持是我的動力??文章來源地址http://www.zghlxwxcb.cn/news/detail-699540.html
到了這里,關(guān)于Spring Cloud--從零開始搭建微服務(wù)基礎(chǔ)環(huán)境【三】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!