教你創(chuàng)建springcloud微服務的基礎子服務的超詳細過程
本文主要是創(chuàng)建兩個springboot服務,以在該系列后面的教程中增添springcloud相關組件
一、創(chuàng)建父項目
1. 選擇Spring Initializr
2. Type選擇為Maven POM,Java Version選擇為8
3. 勾選一些基本的依賴,如lombok和spring-boot-starter-web
4. 創(chuàng)建好了的父項目結構如下:
二、創(chuàng)建二級項目
1. 選擇新建Module
2. 選擇Maven
3. 填寫Name
4. 修改openfeign pom.xml文件,并刪除掉該項目下的src文件
5. 創(chuàng)建完成的項目結構如下
三、創(chuàng)建子項目feign-provider、feign-consumer、feign-api
1. 在feign-provider項目上新建模塊
2. 選擇Parent為openfeign-stu
3. 同上步驟創(chuàng)建feign-consumer、feign-api,創(chuàng)建完成后的整體項目結構如下:
四、完善feign-api、feign-provider、feign-consumer項目
1. springcloud-stu pom.xml中去掉spring-boot-maven-plugin
修改為如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <modules> <module>openfeign-stu</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.wq</groupId> <artifactId>springcloud-stu</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-stu</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
2. openfeign-stu 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>springcloud-stu</artifactId> <groupId>com.wq</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>openfeign-stu</artifactId> <packaging>pom</packaging> <modules> <module>feign-provider</module> <module>feign-consumer</module> <module>feign-api</module> </modules> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependencies> </project>
3. feign-api 完善
feign-api的項目清單如下:
Result的內容如下:
package com.wq.feign.api.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Result { private int code; private String msg; private Object data; }
pom.xml內容就是創(chuàng)建時的內容,不做改動
4. feign-provider 完善
完善后的項目結構如下:
4.1 pom.xml添加feign-api依賴,及增加spring-boot-maven-plugin插件
修改為如下:
<?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>openfeign-stu</artifactId> <groupId>com.wq</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>feign-provider</artifactId> <dependencies> <dependency> <groupId>com.wq</groupId> <artifactId>feign-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
4.2 ProductController.java
package com.wq.feign.provider.controller; import com.wq.feign.api.domain.Result; import com.wq.feign.provider.domain.entity.Product; import com.wq.feign.provider.service.ProductService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @RestController @Slf4j @RequestMapping("/") public class ProductController { @Resource private ProductService productService; /** * 查詢 * @param id * @return */ @GetMapping("product/provider/get/{id}") public Result selectById(@PathVariable("id") Long id){ return new Result(200, "查詢成功", productService.selectById(id)); } * 刪除 @GetMapping("product/provider/delete/{id}") public Result deleteById(@PathVariable("id") Long id){ return new Result(200, "刪除成功", productService.deleteById(id)); * 修改 * @param product @PostMapping("product/provider/update") public Result updateById(@RequestBody Product product){ return new Result(200, "修改成功", productService.updateById(product.getId(), product.getName())); * 新增 @PutMapping( "product/provider/add") public Result insertById(@RequestBody Product product){ return new Result(200, "修改成功", productService.insertOne(product)); }
4.3 ProductMapper.xml
package com.wq.feign.provider.dao; import com.wq.feign.provider.domain.entity.Product; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @Repository public interface ProductMapper { /** * 查詢 * @param id * @return */ public Product selectById(@Param("id") Long id); * 刪除 public int deleteById(@Param("id") Long id); * 修改 * @param name public int updateById(@Param("id") Long id, @Param("name") String name); * 新增 * @param product public int insertOne(Product product); }
4.4 Product.java
package com.wq.feign.provider.domain.entity; import lombok.Data; @Data public class Product { private Long id; private String name; private int stock; }
4.5 ProductServiceImpl.java
package com.wq.feign.provider.service.impl; import com.wq.feign.provider.dao.ProductMapper; import com.wq.feign.provider.domain.entity.Product; import com.wq.feign.provider.service.ProductService; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class ProductServiceImpl implements ProductService { @Resource private ProductMapper productMapper; public Product selectById(Long id) { return productMapper.selectById(id); } public int deleteById(Long id) { return productMapper.deleteById(id); public int updateById(Long id, String name) { return productMapper.updateById(id, name); public int insertOne(Product product) { return productMapper.insertOne(product); }
4.6 ProductService.java
package com.wq.feign.provider.service; import com.wq.feign.provider.domain.entity.Product; /** * 商品服務類 */ public interface ProductService { /** * 查詢 * @param id * @return */ public Product selectById(Long id); * 刪除 public int deleteById(Long id); * 修改 * @param name public int updateById(Long id, String name); * 新增 * @param product public int insertOne(Product product); }
4.7 ProviderApplication.java
package com.wq.feign.provider; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.wq.feign.provider.dao") public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
4.8 ProductMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.wq.feign.provider.dao.ProductMapper"> <resultMap id="BaseResultMap" type="com.wq.feign.provider.domain.entity.Product"> <result column="id" jdbcType="BIGINT" property="id" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="stock" jdbcType="INTEGER" property="stock" /> </resultMap> <!--查詢--> <select id="selectById" resultType="com.wq.feign.provider.domain.entity.Product"> select * from product where id = #{id} </select> <!--刪除--> <delete id="deleteById" parameterType="java.lang.Long"> delete from product where id = #{id} </delete> <!--修改--> <update id="updateById" parameterType="com.wq.feign.provider.domain.entity.Product"> update product set name = #{name} where id = #{id} </update> <!--新增--> <insert id="insertOne" parameterType="com.wq.feign.provider.domain.entity.Product"> insert into product(name, stock) values (#{name}, #{stock}) </insert> </mapper>
4.9 application.yml
server: port: 8081 spring: application: name: feign-provider-8081 datasource: url: jdbc:mysql://localhost:3306/springcloud-stu?useUnicode=true&characterEncoding=utf8&userSSL=false driverClassName: com.mysql.cj.jdbc.Driver username: root password: 123456 mybatis: mapper-locations: classpath:mapper/*Mapper.xml # Mybatis 映射文件位置 type-aliases-package: com.wq.feign.provider.domain.entity # 表對應的實體類包
4.10 sql腳本
DROP TABLE IF EXISTS `product`; CREATE TABLE `product` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `stock` int(10) UNSIGNED NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of product INSERT INTO `product` VALUES (1, '華為 mate10', 10); INSERT INTO `product` VALUES (2, '華為 mate20', 20); INSERT INTO `product` VALUES (3, '華為 mate30', 30);
5. feign-consumer 完善
完善后的項目結構如下
5.1 pom.xml添加feign-api依賴,及增加spring-boot-maven-plugin插件
<?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>openfeign-stu</artifactId> <groupId>com.wq</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>feign-consumer</artifactId> <dependencies> <dependency> <groupId>com.wq</groupId> <artifactId>feign-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
5.2 RestConfig.java
package com.wq.feign.consumer.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestConfig { @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
5.3 ProductConsumerController.java
package com.wq.feign.consumer.controller; import com.wq.feign.api.domain.Result; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class ProductConsumerController { @Resource RestTemplate restTemplate; public static String url = "http://localhost:8081/"; /** * 查詢 * @param id * @return */ @GetMapping("product/consumer/get/{id}") public Result selectById(@PathVariable("id") Long id){ return restTemplate.getForObject(url+"product/provider/get/"+id, Result.class); } }
5.4 ConsumerApplication.java
package com.wq.feign.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
5.5 application.yml
server: port: 8082 spring: application: name: feign-consumer-8082
五、測試項目
啟動ProviderApplication和ConsumerApplication
使用瀏覽器訪問,得到結果如下:
六 總結
我們至此創(chuàng)建了一個多模塊的項目,然后有一個商品服務提供者feign-provider-8081 和一個商品服務消費者feign-consumer-8082 。
然后這就是最簡單的兩個微服務了,實現(xiàn)了功能的解耦。
但是這個簡單的微服務存在著很多問題:
比如都用公共的實體類Result,還有提供者地址在消費者里面寫死了等等,這些問題,我們接下來會一一解決。
到此這篇關于教你創(chuàng)建springcloud微服務的基礎子服務的文章就介紹到這了,更多相關springcloud微服務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
@AutoConfigurationPackage與@ComponentScan注解區(qū)別
這篇文章主要介紹了@AutoConfigurationPackage與@ComponentScan注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06SpringBoot在IDEA中實現(xiàn)熱部署的步驟
這篇文章主要介紹了SpringBoot在IDEA中實現(xiàn)熱部署的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11Java存儲過程調用CallableStatement的方法
這篇文章主要介紹了Java存儲過程調用CallableStatement的方法,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下2020-11-11詳解快速排序算法中的區(qū)間劃分法及Java實現(xiàn)示例
這篇文章主要介紹了詳解快速排序算法中的區(qū)間劃分法及Java實現(xiàn)示例,文中分別介紹了快排時兩種區(qū)間劃分的思路,需要的朋友可以參考下2016-04-04Spring FreeMarker整合Struts2過程詳解
這篇文章主要介紹了Spring FreeMarker整合Struts2過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10