今天來到SpringCloud的學習,我們從spring boot微服務階段,學習到了用springboot去建立很多的微服務,但是這麼多微服務我們如果去管理,以及相互之間的聯絡呢?
而到了我們學習springcloud階段,其實相對而言是變簡單的,不需要寫很多程式碼以及什麼操作,主要就是接收思想,瞭解其中的機制,而springCloud專案基於springboot專案,只需要幾行簡單的設定即可開始使用;
那來到了我們最熟悉的官網:https://spring.io/
進入spring cloud的學習,可以去讀讀這裡的話,我讀懂了,不告訴你
從springcloud的學習,我們可以看這張圖,我們學習這裡面幾個部分
環境說明:jdk1.8,idea2019,maven3.6.X,springcloud最新版2021.0.3,mybatis-plus
我們首先搭建一個父工程專案,建立一個空的普通的maven專案,我們直接把src目錄刪除掉,pom檔案寫下面的使用父工程管理依賴,這裡都是與文章日期最新依賴。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.24</lombok.version>
<springcloud-version>2021.0.3</springcloud-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!--springcloud依賴-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springcloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springboot依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--紀錄檔測試-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<!--父工程的專案名稱-->
<finalName>springcloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<!--以$開頭結尾 符合在src/main/resources路徑下面存取到 主要是yml檔案或者properties檔案-->
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
有了父工程專案,我們再準備一個資料庫環境,寫一個api類,這裡我們新建一個簡單的賬戶表,往裡面插入幾條簡單的資料
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`account_id` int(11) NOT NULL,
`account_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`account_pwd` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
PRIMARY KEY (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES ('1', 'zhangsan', '333');
INSERT INTO `account` VALUES ('2', 'lisi', '444');
INSERT INTO `account` VALUES ('3', 'wangwu', '555');
INSERT INTO `account` VALUES ('4', 'zhangliu', '666');
INSERT INTO `account` VALUES ('5', 'qiqi', '777');
INSERT INTO `account` VALUES ('6', 'baba', '888');
新建一個maven普通專案起名叫springcloud-api,裡面呢,放一個這樣的實體類,與表的關係對應起來的一個簡單物件,使用了lombok,這裡大家可以自行去了解
1、匯入依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
我們可以看到這裡如果正確會有一個小圓圈,如果你這裡沒有,那就要檢查下父工程依賴了
2、編寫設定,這裡沒有什麼設定,所以就是濾過
3、編寫對應程式碼
再新建一個maven普通專案模組,我們做服務的提供者
1、匯入依賴
<dependencies>
<dependency>
<groupId>com.xuexi</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2、編寫設定
新建一個application.yml檔案,內容如下:
server:
port: 8001
spring:
application:
name: springcloud-provider-account
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/lianxi?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8
username: root
password:
type: com.alibaba.druid.pool.DruidDataSource #使用阿里的資料來源
# mybatis-plus設定紀錄檔
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.xuexi.pojo
mapper-locations: classpath:mapper/*.xml
global-config:
db-config:
table-underline: true #實體類駝峰轉下劃線,預設就是
3、編寫程式碼,服務提供者我們只需要編寫dao層和service層,這裡使用了mybaits-plus所以比較簡單,直接給大家截圖
dao層
service層
這裡我們可以編寫一個controller進行下測試
@RestController
public class AccountController {
@Autowired
AccountService accountService;
@PostMapping("/account/add")
public boolean addAccount(Account account){
return accountService.save(account);
}
@GetMapping("/account/get/{id}")
public Account get(@PathVariable("id") long id){
return accountService.getById(id);
}
@GetMapping("/account/list")
public List<Account> getAll(){
return accountService.list(null);
}
}
測試成功
同樣的我們再建一個普通的maven子工程專案,我們進行服務的消費
1、匯入依賴
<dependencies>
<dependency>
<groupId>com.xuexi</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
2、編寫設定
新建一個application.yml
server:
port: 80
3、編寫程式碼
程式碼編寫前,我們認識一個東西,就是我們的標題,REST這個東西,這裡我覺得你學到這裡應該很容易理解,所以我覺得還是先上程式碼吧
首先編寫一個config設定類,我們把RestTemplate這個物件接管到spring容器中
@Configuration
public class BeanConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
接著編寫我們的消費程式碼,ConsumerController
@RestController
public class ConsumerController {
private static final String REST_URL_PREFIX = "http://localhost:8001";
@Autowired
RestTemplate restTemplate;
@PostMapping("/cousumer/add")
public boolean addAccount(Account account) {
return restTemplate.postForObject(REST_URL_PREFIX+"/account/add",account,boolean.class);
}
@GetMapping("/cousumer/get/{id}")
public Account get(@PathVariable("id") long id) {
return restTemplate.getForObject(REST_URL_PREFIX+"/account/get/"+id,Account.class);
}
@GetMapping("/cousumer/list")
public List<Account> getAll() {
return restTemplate.getForObject(REST_URL_PREFIX+"/account/list",List.class);
}
}
上面我都沒有給大家說編寫springboot啟動類,別到這裡還沒啟動呀,每一個專案下面,編寫一個這樣的啟動類
@SpringBootApplication
public class Consumer_80 {
public static void main(String[] args) {
SpringApplication.run(Consumer_80.class,args);
}
}
我們啟動下消費方,看下是否可以遠端呼叫服務方服務,測試成功,遠端呼叫了我們的服務消費掉
其實我們都學過網路請求,RestTemplate其實就是封裝好的一個請求物件,然後可以通過get|post|delete|put請求,裡面也沒有多少方法,點以下就都出來了,這麼簡單,很容易看懂並學會吧!
其實就像前後段分離,傳送非同步請求,通過不斷地請求服務,然後去實現功能,一種直連的方式,對地址和埠請求服務
但是我們可以發現,這樣是有缺點的,比如provider宕機了,consumer請求是請求不到了的,而且也不能做一些檢測,負載均衡,輪詢等方式;那我們接著學習再加一層
下一篇我們嘗試下使用Eureka註冊中心,持續更新中·····
趕緊點個關注吧,之後還會更新整個springcloud系列,關注不迷路,點個贊也行啊,bye~