環境搭建
模塊設計
- springcloud-alibaba 父工程
- shop-common 公共模塊【實體類】
- shop-user 用戶微服務 【端口: 807x】
- shop-product 商品微服務 【端口: 808x】
- shop-order 訂單微服務 【端口: 809x】
1:創建一個maven父工程(刪掉其他附屬文件保留一個pom.xml)如下圖目錄
2:引入相關依賴 pom.xml

<groupId>com.chenpt</groupId> <artifactId>springcloud-alibaba</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>shop-user</module> <module>shop-product</module> <module>shop-common</module> </modules> <!--父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.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>Greenwich.RELEASE</spring-cloud.version> <!-- <spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>--> <spring-cloud-alibaba.version>2.1.0.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> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> </dependencies>
3:創建基礎模塊
3.1:shop-common 在pom中添加依賴

<?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>springcloud-alibaba</artifactId> <groupId>com.chenpt</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>shop-common</artifactId> <!--依賴--> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.1.13.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.56</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies> </project>
創建實體類

/訂單 @Entity(name = "shop_order") @Data public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long oid;//訂單id //用戶 private Integer uid;//用戶id private String username;//用戶名 //商品 private Integer pid;//商品id private String pname;//商品名稱 private Double pprice;//商品單價 //數量 private Integer number;//購買數量 }

//商品 @Entity(name = "shop_product") @Data public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer pid;//主鍵 private String pname;//商品名稱 private Double pprice;//商品價格 private Integer stock;//庫存 }

//用戶 @Entity(name = "shop_user")//實體類跟數據表的對應 @Data public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY)//數據庫自增 private Integer uid;//主鍵 private String username;//用戶名 private String password;//密碼 private String telephone;//手機號 }
3.2:shop-user

<dependencies>
<!--springboot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--shop-common-->
<dependency>
<groupId>com.chenpt</groupId>
<artifactId>shop-mommon</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>

server: port: 8071 spring: application: name: service-user datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: root jpa: properties: hibernate: hbm2ddl: auto: update dialect: org.hibernate.dialect.MySQL5InnoDBDialect cloud: nacos: discovery: server-addr: 127.0.0.1:8848
3.3:shop-product

<?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>springcloud-alibaba</artifactId> <groupId>com.chenpt</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>shop-product</artifactId> <dependencies> <!--springboot-web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--shop-common--> <dependency> <groupId>com.chenpt</groupId> <artifactId>shop-mommon</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> </project>

server: port: 8081 spring: application: name: service-product datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.61.131:3306/shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: root jpa: properties: hibernate: hbm2ddl: auto: update dialect: org.hibernate.dialect.MySQL5InnoDBDialect
工程主類

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication public class ProductApplication { public static void main(String[] args) { SpringApplication.run(ProductApplication.class,args); } }
創建dao

import com.chenpt.domain.Product; import org.springframework.data.jpa.repository.JpaRepository; public interface ProductDao extends JpaRepository<Product, Integer> { }
service接口及實現類

public interface ProductService { //根據pid查詢商品信息 Product findByPid(Integer pid); }

@Service public class ProductServiceImpl implements ProductService { @Autowired private ProductDao productDao; @Override public Product findByPid(Integer pid) { return productDao.findById(pid).get(); } }
創建cotroller

@RestController @Slf4j public class ProductController { @Autowired private ProductService productService; //商品信息查詢 @RequestMapping("/product/{pid}") public Product product(@PathVariable("pid") Integer pid) { log.info("接下來要進行{}號商品信息的查詢", pid); Product product = productService.findByPid(pid); log.info("商品信息查詢成功,內容為{}", JSON.toJSONString(product)); return product; } }
啟動工程,等到數據庫表創建完畢之后,加入測試數據
INSERT INTO shop_product VALUE(NULL,'小米','1000','5000'); INSERT INTO shop_product VALUE(NULL,'華為','2000','5000'); INSERT INTO shop_product VALUE(NULL,'蘋果','3000','5000'); INSERT INTO shop_product VALUE(NULL,'OPPO','4000','5000');
3.4:shop-order

<?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>springcloud-alibaba</artifactId> <groupId>com.chenpt</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>shop-order</artifactId> <dependencies> <!--springboot-web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--shop-common--> <dependency> <groupId>com.chenpt</groupId> <artifactId>shop-mommon</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> </project>

@SpringBootApplication public class OrderApplication { public static void main(String[] args){ SpringApplication.run(OrderApplication.class); } @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } }
dao
public interface OrderDao extends JpaRepository<Order,Integer> { }
service
public interface OrderService { void save(Order order); }
serviceImpl
@Service public class OrderServiceImpl implements OrderService { @Autowired private OrderDao orderDao; @Override public void save(Order order) { orderDao.save(order); } }

@Slf4j @RestController @RequestMapping("/order") public class OrderController { private static final String PRODUCT_URL = "http://localhost:8081/product/"; private static final String PRODUCT_SERVER = "service-product"; @Autowired private OrderService orderService; @Autowired private RestTemplate restTemplate; /** * 采用restTemplate調用商品微服務 * 硬編碼風格 后期不容易維護 無法實現集群 * @param pid * @return */ @GetMapping("/prod/{pid}") public Order order3(@PathVariable("pid") Integer pid){ log.info(">>>客戶下單,調用商品微服務查詢商品信息<<<"); // 采用restTemplate調用 Product product = restTemplate.getForObject(PRODUCT_URL+pid, Product.class); log.info(">>商品信息,查詢結果:" + JSON.toJSONString(product)); Order order = new Order(); order.setUid(1); order.setUsername("測試用戶1"); order.setPid(product.getPid()); order.setPname(product.getPname()); order.setPprice(product.getPprice()); order.setNumber(1); orderService.save(order); return order; } }
至此整個環境就算搭建完畢,不過目前沒接入微服務的組件,也就屬於maven多模塊開發 進行了拆分
通過orderController模擬下單請求 可以發現order服務調用商品服務采用的是restTemplate方式,其中商品服務的信息都是硬編碼到order服務中,其中弊端一目了然
比如:
- 商品服務掛了,將導致整個服務不可用
- 地址變更,手動修改
- 服務增多后期維護復雜
- 多個服務提供者無法實現負載均衡
接下來就以此項目為基礎進行微服務學習