微服務專案搭建
微服務專案搭建
先了解一下單體、叢集、分散式和微服務概念
單體、叢集、分散式和微服務概念
1.單體:就是把專案都部署到同一機器上
優點:
-
專案架構簡單,小型專案的話, 開發成本低
-
專案部署在一個節點上, 維護方便
缺點:
-
全部功能整合在一個工程中,對於大型專案來講不易開發和維護
-
專案模組之間緊密耦合,單點容錯率低
-
無法針對不同模組進行鍼對性優化和水平擴充套件
2.叢集:把同樣的服務部署到多臺機器形成多節點的叢集,多節點提供相同的服務,從而使系統的處理能力得到更大的提升
優點:
- 強擴充套件能力
- 更容易實現
- 高可用性
- 容易管理
缺點:
- 當應用出現故障需要重新修復運轉時,其他伺服器會接管該應用的資料區,而這個接管過程卻需要消耗一些時間,應用越大,接管時間越長,會造成一定的延誤。
3.分散式: 分散式是從部署的角度去講的, 我們一個完整專案部署的時候部署到了多型機器當中,那麼我們的架構就可以稱之為分散式的架構
優點:
- 抽取公共的功能為服務層,提高程式碼複用性
缺點:
- 系統間耦合度變高,呼叫關係錯綜複雜,難以維護
4.微服務架構: 從業務拆分的角度去講, 我們一個大的專案有很多業務, 我們可以按照業務進行拆分, 拆分成若干個小的服務,這個小的服務連線著各自的資料庫, 每一個服務獨立執行, 服務與服務之間互不干擾, 這個就稱之為微服務架構
優點:
-
服務原子化拆分,獨立打包、部署和升級,保證每個微服務清晰的任務劃分,利於擴充套件
-
微服務之間採用RESTful等輕量級Http協議相互呼叫
缺點:
- 分散式系統開發的技術成本高(容錯、分散式事務等)
接下來開始專案的搭建~
1. 建立父工程
建立一個maven工程,然後在pom.xml檔案中新增下面內容
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.test</groupId>
<artifactId>shop-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!--父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<!--依賴版本的鎖定-->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2. 建立商品微服務
1.建立shop-product-api專案,然後在pom.xml檔案中新增下面內容
<?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>shop-parent</artifactId>
<groupId>cn.tset</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shop-product-api</artifactId>
<!--依賴-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2 建立實體類
//商品
@Entity(name = "t_shop_product")
@Data
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long pid;//主鍵
private String pname;//商品名稱
private Double pprice;//商品價格
private Integer stock;//庫存
}
3.建立shop-product-server專案,然後在pom.xml檔案中新增下面內容
<?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>shop-parent</artifactId>
<groupId>cn.test</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shop-product-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>cn.test</groupId>
<artifactId>shop-product-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
4.編寫啟動類ProductServer.java
package cn.test;
@SpringBootApplication
public class ProductServer {
public static void main(String[] args) {
SpringApplication.run(ProductServer.class,args);
}
}
5.編寫配置檔案application.yml
server:
port: 8081
spring:
application:
name: product-service
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///shop-product?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: admin
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
6.在資料庫中建立shop-product的資料庫
7.建立ProductDao
package cn.test.dao;
public interface ProductDao extends JpaRepository<Product, Long> {
}
8.建立ProductService介面和實現類
package cn.test.service.impl;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Override
public Product findByPid(Long pid) {
return productDao.findById(pid).get();
}
}
9.建立Controller
package cn.test.controller;
@RestController
@Slf4j
public class ProductController {
@Autowired
private ProductService productService;
//商品資訊查詢
@RequestMapping("/product")
public Product findByPid(@RequestParam("pid") Long pid) {
log.info("接下來要進行{}號商品資訊的查詢", pid);
Product product = productService.findByPid(pid);
log.info("商品資訊查詢成功,內容為{}", JSON.toJSONString(product));
return product;
}
}
10.啟動工程,等到資料庫表建立完畢之後,加入測試資料
INSERT INTO t_shop_product VALUE(NULL,'小米','1000','5000');
INSERT INTO t_shop_product VALUE(NULL,'華為','2000','5000');
INSERT INTO t_shop_product VALUE(NULL,'蘋果','3000','5000');
INSERT INTO t_shop_product VALUE(NULL,'OPPO','4000','5000');
11.通過瀏覽器訪問服務
3. 建立訂單微服務
1.建立shop-order-api專案,然後在pom.xml檔案中新增下面內容
<?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>shop-parent</artifactId>
<groupId>cn.test</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shop-order-api</artifactId>
<!--依賴-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2 建立實體類
//訂單
@Entity(name = "t_shop_order")
@Data
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long oid;//訂單id
//使用者
private Long uid;//使用者id
private String username;//使用者名稱
//商品
private Long pid;//商品id
private String pname;//商品名稱
private Double pprice;//商品單價
//數量
private Integer number;//購買數量
}
3.建立shop-order-server專案,然後在pom.xml檔案中新增下面內容
<?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>shop-parent</artifactId>
<groupId>cn.test</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shop-order-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>cn.test</groupId>
<artifactId>shop-order-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
4.編寫啟動類OrderServer.java
package cn.test;
@SpringBootApplication
public class OrderServer {
public static void main(String[] args) {
SpringApplication.run(OrderServer.class,args);
}
}
5.編寫配置檔案application.yml
server:
port: 8082
spring:
application:
name: order-service
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///shop-order?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: admin
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
6.在資料庫中建立shop-order的資料庫
7.建立OrderDao
package cn.test.dao;
public interface OrderDao extends JpaRepository<Order, Long> {
}
8.建立OrderService介面和實現類
package cn.test.service.impl;
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Override
public Order createOrder(Long productId,Long userId) {
// TODO: 2021/5/6 後面需要通過productId查詢真正Product資料
//通過Feign實現遠端呼叫
//Product product = productFeignApi.findByPid(productId);
Order order = new Order();
order.setUid(userId);
order.setUsername("James");
order.setPid(1);
order.setPname("小米data from port:8081");
order.setPprice("1000");
order.setNumber(1);
orderDao.save(order);
log.info("建立訂單成功,訂單資訊為{}", JSON.toJSONString(order));
return order;
}
}
9.建立Controller
package cn.test.controller;
@RestController
@Slf4j
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("/save")
public Order order(Long pid,Long uid) {
return orderService.createOrder(pid,uid);
}
}
到這裡我們已經把一個最簡單的微服務專案搭建好了,可以看到上面我們把商品服務和訂單服務各自搭建SpringBoot專案,在真正的開發中,每個微服務都是部署到各自一臺機器上的,但由於只是學習用的,也只有一臺電腦,所以在這裡只是模擬部署到兩臺機器上了。分別部署到了兩個Tomcat上,埠分別是8081和8082。
上面案例並沒有真正通過遠端呼叫product-service微服務去獲取真正的Product資料,後面分享Ribbon和Feign元件時會實現遠端呼叫微服務。