1. 程式人生 > 其它 >微服務專案搭建

微服務專案搭建

微服務專案搭建

先了解一下單體、叢集、分散式和微服務概念

單體、叢集、分散式和微服務概念

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元件時會實現遠端呼叫微服務。

springCloud Alibaba之Nacos元件