飞道的博客

Spring Cloud 云架构下的微服务架构:部门微服务(Dept)

394人阅读  评论(0)

作者 | springML

来源 | CSDN 博客 责编 | Carol

出品 | CSDN云计算(ID:CSDNcloud)

封图| CSDN下载于视觉中国 

对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为了清晰可见,创建一套新的微服务架构:部门微服务(Dept)

如果要想进行 SpringCloud 开发,那么一定要对 SpringBoot 有一定的了解,同时本次也将融合 MyBatis 开发技术实现整体的微服务的创建处理。

搭建项目环境

对于现在的项目创建一个:microcloud 的整体父 pom 项目,那么随后为了方便管理,将创建其三个子模块:

  • microcloud-api 模块,作为公共的信息导入配置模块;

  • microcloud-provider-dept-8001:作为服务提供者,该提供者负责使用 Mybatis 与数据库交互;

  • microcloud-consumer-80:作为微服务调用的客户端使用。

1.1 创建一个新的 maven 项目:microcloud;

1.2 【microcloud】修改 pom.xml 文件,主要追加 springcloud 与 springboot 两个开发包的依赖关系;


   
  1. <project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion> 4.0 .0</modelVersion>
  4.     <groupId>cn.study</groupId>
  5.     <artifactId>microcloud</artifactId>
  6.     <version> 0.0 .1</version>
  7.     <packaging>pom</packaging>
  8.     <name>microcloud</name>
  9.     <url>http: //maven.apache.org</url>
  10.     <properties>
  11.         <jdk.version> 1.8</jdk.version>
  12.         <project.build.sourceEncoding>UTF -8</project.build.sourceEncoding>
  13.     </properties>
  14.     <dependencyManagement>
  15.         <dependencies>
  16.             <dependency>    <!-- 进行SpringCloud依赖包的导入处理 -->
  17.                 <groupId>org.springframework.cloud</groupId>
  18.                 <artifactId>spring-cloud-dependencies</artifactId>
  19.                 <version>Dalston.SR1</version>
  20.                 <type>pom</type>
  21.                 <scope>import</scope>
  22.             </dependency>
  23.             <dependency>    <!-- SpringCloud离不开SpringBoot,所以必须要配置此依赖包 -->
  24.                 <groupId>org.springframework.boot</groupId>
  25.                 <artifactId>spring-boot-dependencies</artifactId>
  26.                 <version> 1.5 .4.RELEASE</version>
  27.                 <type>pom</type>
  28.                 <scope>import</scope>
  29.             </dependency>
  30.         </dependencies>
  31.     </dependencyManagement>
  32.     <build>
  33.         <finalName>microcloud</finalName>
  34.         <plugins>
  35.             <plugin>
  36.                 <groupId>org.apache.maven.plugins</groupId>
  37.                 <artifactId>maven-compiler-plugin</artifactId>
  38.                 <configuration>
  39.                     <source>${jdk.version}</source><!-- 源代码使用的开发版本 -->
  40.                     <target>${jdk.version}</target><!-- 需要生成的目标 class文件的编译版本 -->
  41.                     <encode>${project.build.sourceEncoding}</encode>
  42.                 </configuration>
  43.             </plugin>
  44.         </plugins>
  45.     </build>
  46. </project>

1)【microcloud-api】建立一个 api 的公共模块,该模块的主要功能是提供有公共处理类,本次预计建立一个 Dept 数据表,里面的字段:deptno(Long)、dname(String)、loc(保存的数据库的名字);


   
  1. package cn.study.vo;
  2. import java.io.Serializable;
  3. @SuppressWarnings( "serial")
  4. public  class Dept implements Serializable {
  5.      private Long deptno ;
  6.      private String dname ;
  7.      private String loc ;
  8.      public Long getDeptno() {
  9.          return deptno;
  10.     }
  11.      public void setDeptno(Long deptno) {
  12.         this.deptno = deptno;
  13.     }
  14.      public String getDname() {
  15.          return dname;
  16.     }
  17.      public void setDname(String dname) {
  18.         this.dname = dname;
  19.     }
  20.      public String getLoc() {
  21.          return loc;
  22.     }
  23.      public void setLoc(String loc) {
  24.         this.loc = loc;
  25.     }
  26.     @Override
  27.      public String toString() {
  28.          return  "Dept [deptno=" + deptno +  ", dname=" + dname +  ", loc=" + loc
  29.                 +  "]";
  30.     }
  31. }

3、 创建一个 Rest 提供者的【microcloud-provider-dept-8001】项目模块,在这个模块里面主要定义要使用的数据库脚本:


   
  1. DROP DATABASE  IF EXISTS  "study8001" ;
  2. CREATE DATABASE study8001 CHARACTER SET UTF8 ;
  3. USE  study8001 ;
  4. CREATE TABLE dept (
  5.     deptno        BIGINT        AUTO_INCREMENT ,
  6.     dname        VARCHAR( 50) ,
  7.     loc            VARCHAR( 50) ,
  8.     CONSTRAINT pk_deptno PRIMARY KEY(deptno)
  9. ) ;
  10. INSERT INTO dept(dname,loc) VALUES ( '开发部',database()) ;
  11. INSERT INTO dept(dname,loc) VALUES ( '财务部',database()) ;
  12. INSERT INTO dept(dname,loc) VALUES ( '市场部',database()) ;
  13. INSERT INTO dept(dname,loc) VALUES ( '后勤部',database()) ;
  14. INSERT INTO dept(dname,loc) VALUES ( '公关部',database()) ;

由于在整个微服务里面需要进行负载均衡的操作,所以本次在使用的时候加入了数据库的名称信息。

创建 Dept 微服务

所谓的微服务的核心本质就是 JSON 的传输,那么既然现在要求使用 MyBatis 进行数据库操作,所以应该在项目里面配置 Druid 数据库连接池,而后对外进行项目的发布。

1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加相关的依赖程序支持包:


   
  1.     <dependencies>
  2.        <dependency>
  3.            <groupId>cn.study</groupId>
  4.            <artifactId>microcloud-api</artifactId>
  5.        </dependency>
  6.        <dependency>
  7.            <groupId>junit</groupId>
  8.            <artifactId>junit</artifactId>
  9.            <scope>test</scope>
  10.        </dependency>
  11.        <dependency>
  12.            <groupId>mysql</groupId>
  13.            <artifactId>mysql-connector-java</artifactId>
  14.        </dependency>
  15.        <dependency> 
  16.            <groupId>com.alibaba</groupId>
  17.            <artifactId>druid</artifactId>
  18.        </dependency>
  19.        <dependency>
  20.            <groupId>ch.qos.logback</groupId>
  21.            <artifactId>logback-core</artifactId>
  22.        </dependency>
  23.        <dependency>
  24.            <groupId>org.mybatis.spring.boot</groupId>
  25.            <artifactId>mybatis-spring-boot-starter</artifactId>
  26.        </dependency>
  27.        <dependency>
  28.            <groupId>org.springframework.boot</groupId>
  29.            <artifactId>spring-boot-starter-jetty</artifactId>
  30.        </dependency>
  31.        <dependency>
  32.            <groupId>org.springframework.boot</groupId>
  33.            <artifactId>spring-boot-starter-web</artifactId>
  34.        </dependency>
  35.        <dependency>
  36.            <groupId>org.springframework.boot</groupId>
  37.            <artifactId>spring-boot-starter-test</artifactId>
  38.            <scope>test</scope>
  39.        </dependency>
  40.        <dependency>
  41.            <groupId>org.springframework</groupId>
  42.            <artifactId>springloaded</artifactId>
  43.        </dependency>
  44.        <dependency>
  45.            <groupId>org.springframework.boot</groupId>
  46.            <artifactId>spring-boot-devtools</artifactId>
  47.        </dependency>
  48.    </dependencies>

2、 【microcloud-provider-dept-8001】创建一个 IDeptDAO 数据操作接口,这个接口里面将提供有三个数据操作方法:


   
  1. package cn.study.microcloud.dao;
  2. import java.util. List;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import cn.study.vo.Dept;
  5. @Mapper
  6. public  interface IDeptDAO {
  7.      public boolean doCreate(Dept vo) ;
  8.      public Dept findById(Long id) ;
  9.      public  List<Dept> findAll() ;
  10. }

3、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加 mybatis 和服务的相关配置信息:


   
  1. server:
  2.   port:  8001
  3. mybatis:
  4.   config-location: classpath:mybatis/mybatis.cfg.xml     # mybatis配置文件所在路径
  5.   type-aliases-package: cn.study.vo             # 定义所有操作类的别名所在包
  6.   mapper-locations:                                      # 所有的mapper映射文件
  7.   - classpath:mybatis/mapper /**/*.xml
  8. spring:
  9.   datasource:
  10.     type: com.alibaba.druid.pool.DruidDataSource     # 配置当前要使用的数据源的操作类型
  11.     driver- class-nameorg.gjt.mm.mysql.Driver      # 配置MySQL的驱动程序类
  12.      urljdbc: mysql:// localhost:3306/ study8001           # 数据库连接地址
  13.      usernameroot                                  # 数据库用户名
  14.      passwordmysqladmin                            # 数据库连接密码
  15.      dbcp2:                                          # 进行数据库连接池的配置
  16.        min- idle: 5                                   # 数据库连接池的最小维持连接数    
  17.        initial- size: 5                               # 初始化提供的连接数
  18.        max- total: 5                                  # 最大的连接数
  19.        max- wait- millis: 200                          # 等待连接获取的最大超时时间

4、 【microcloud-provider-dept-8001】定义 src/main/resources/mybatis/mybatis.cfg.xml 配置文件:


   
  1. <?xml version= "1.0" encoding= "UTF-8"  ?>
  2. <!DOCTYPE configuration   
  3.      PUBLIC  "-//mybatis.org//DTD Config 3.0//EN"   
  4.      "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration> <!-- 进行Mybatis的相应的环境的属性定义 -->
  6.     <settings>    <!-- 在本项目之中开启二级缓存 -->
  7.         <setting name= "cacheEnabled" value= "true"/>
  8.     </settings>
  9. </configuration>

5、 【microcloud-provider-dept-8001】修改 src/main/resources/mybatis/mapper/cn/mldn/Dept.xml 配置文件:


   
  1. <?xml version= "1.0" encoding= "UTF-8" ?>
  2. <!DOCTYPE mapper  PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN" 
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper  namespace=" cn. study. microcloud. dao. IDeptDAO">
  5.     < select  id=" findByIdresultType=" DeptparameterType=" long">
  6.          SELECT  deptno, dname, loc  FROM  dept  WHERE  deptno=#{ deptno} ;
  7.     </select>
  8.     <select id= "findAll" resultType= "Dept">
  9.         SELECT deptno,dname,loc FROM dept ;
  10.     </select>
  11.     <insert id= "doCreate" parameterType= "Dept">
  12.         INSERT INTO dept(dname,loc) VALUES ( #{dname},database()) ;
  13.     </insert>
  14. </mapper> 

6、 【microcloud-provider-dept-8001】建立 IDeptService 接口,做业务实现:


   
  1. package cn.study.microcloud.service;
  2. import java.util. List;
  3. import cn.study.vo.Dept;
  4. public  interface IDeptService {
  5.      public Dept get(long id) ;
  6.      public boolean add(Dept dept) ;
  7.      public  List<Dept>  list() ;
  8. }
  9. package cn.study.microcloud.service.impl;
  10. import java.util. List;
  11. import javax.annotation.Resource;
  12. import org.springframework.stereotype.Service;
  13. import cn.study.microcloud.dao.IDeptDAO;
  14. import cn.study.microcloud.service.IDeptService;
  15. import cn.study.vo.Dept;
  16. @Service
  17. public  class DeptServiceImpl implements IDeptService {
  18.     @Resource
  19.      private IDeptDAO deptDAO ;
  20.     @Override
  21.      public Dept get(long id) {
  22.          return this.deptDAO.findById(id);
  23.     }
  24.     @Override
  25.      public boolean add(Dept dept) {
  26.          return this.deptDAO.doCreate(dept);
  27.     }
  28.     @Override
  29.      public  List<Dept>  list() {
  30.          return this.deptDAO.findAll();
  31.     }
  32. }

7、 【microcloud-provider-dept-8001】定义程序的运行主类


   
  1. package cn.study.microcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public  class Dept_8001_StartSpringCloudApplication {
  6.      public  static void main(String[] args) {
  7.         SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args);
  8.     }
  9. }

8、 【microcloud-provider-dept-8001】进行业务接口测试编写:


   
  1. package cn.study.test;
  2. import  static org.junit.Assert.fail;
  3. import javax.annotation.Resource;
  4. import org.junit.Test;
  5. import org.junit.runner.RunWith;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8. import org.springframework.test.context.web.WebAppConfiguration;
  9. import cn.study.microcloud.Dept_8001_StartSpringCloudApplication;
  10. import cn.study.microcloud.service.IDeptService;
  11. import cn.study.vo.Dept;
  12. @SpringBootTest(classes = Dept_8001_StartSpringCloudApplication.class)
  13. @RunWith(SpringJUnit4ClassRunner.class)
  14. @WebAppConfiguration
  15. public  class IDeptServiceTest {
  16.     @Resource
  17.      private IDeptService deptService ;
  18.     @Test
  19.      public void testGet() {
  20.         System.out.println(this.deptService.get( 1));
  21.     }
  22.     @Test
  23.      public void testAdd() {
  24.         Dept dept =  new Dept() ;
  25.         dept.setDname( "测试部-" + System.currentTimeMillis());
  26.         System.out.println(this.deptService.add(dept)); 
  27.     }
  28.     @Test
  29.      public void testList() {
  30.         System.out.println(this.deptService. list());
  31.     }
  32. }

9、 【microcloud-provider-dept-8001】建立Restful的DeptRest 服务类:


   
  1. package cn.study.microcloud.rest;
  2. import javax.annotation.Resource;
  3. import org.springframework.web.bind.annotation.PathVariable;
  4. import org.springframework.web.bind.annotation.RequestBody;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import cn.study.microcloud.service.IDeptService;
  9. import cn.study.vo.Dept;
  10. @RestController
  11. public  class DeptRest {
  12.     @Resource
  13.      private IDeptService deptService ;
  14.     @RequestMapping(value= "/dept/get/{id}",method=RequestMethod.GET)
  15.      public Object get(@PathVariable( "id") long id) {
  16.          return this.deptService.get(id) ;
  17.     }
  18.     @RequestMapping(value= "/dept/add",method=RequestMethod.GET)
  19.      public Object add(@RequestBody Dept dept) {
  20.          return this.deptService.add(dept) ;
  21.     }
  22.     @RequestMapping(value= "/dept/list",method=RequestMethod.GET)
  23.      public Object  list() {
  24.          return this.deptService. list() ;
  25.     }
  26. }

10、 修改 hosts 配置文件,追加一个映射路径(路径:C:\Windows\System32\drivers\etc\hosts)。

127.0.0.1 dept-8001.com

11、 观察 Rest 服务能否正常提供:

· 调用 get 操作:dept-8001.com:8001/dept/get/1;

· 调用 list 操作:dept-8001.com:8001/dept/list;

客户端调用微服务

1、 创建一个 Maven 的新的模块:microcloud-consumer-80;

2、 【microcloud-consumer-80】修改 application.yml 配置文件:


   
  1. server:
  2.   port:  80

3、 【microcloud-consumer-80】创建一个 Rest 的配置程序类,主要进行 RestTemplate 类对象创建,这里很重要,编写这个类然后在控制器里面使用@Resource注解注入以后控制器就可以调用其他微服务了


   
  1. package cn.study.microcloud.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. @Configuration
  6. public  class RestConfig {
  7.     @Bean
  8.      public RestTemplate getRestTemplate() {
  9.          return  new RestTemplate() ;
  10.     }
  11. }

4、 【microcloud-consumer-80】创建一个控制器,为了简化处理,本次不再进行页面定义了,所有服务结果都使用 Rest 返回;


   
  1. package cn.study.microcloud.controller;
  2. import java.util. List;
  3. import javax.annotation.Resource;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.web.client.RestTemplate;
  7. import cn.study.vo.Dept;
  8. @RestController
  9. public  class ConsumerDeptController {
  10.      public  static  final String DEPT_GET_URL =  "http://dept-8001.com:8001/dept/get/";
  11.      public  static  final String DEPT_LIST_URL =  "http://dept-8001.com:8001/dept/list/";
  12.      public  static  final String DEPT_ADD_URL =  "http://dept-8001.com:8001/dept/add";
  13.      //使用@Resource注解注入RestTemplate以后控制器就可以调用其他微服务了
  14.     @Resource
  15.      private RestTemplate restTemplate;
  16.     @RequestMapping(value =  "/consumer/dept/get")
  17.      public Object getDept(long id) {
  18.         Dept dept = this.restTemplate.getForObject(DEPT_GET_URL + id,
  19.                 Dept.class);
  20.          return dept;
  21.     }
  22.     @SuppressWarnings( "unchecked")
  23.     @RequestMapping(value =  "/consumer/dept/list")
  24.      public Object listDept() {
  25.          List<Dept> allDepts = this.restTemplate.getForObject(DEPT_LIST_URL,
  26.                  List.class); 
  27.          return allDepts;
  28.     }
  29.     @RequestMapping(value =  "/consumer/dept/add")
  30.      public Object addDept(Dept dept) {
  31.         Boolean flag = this.restTemplate.postForObject(DEPT_ADD_URL, dept,
  32.                 Boolean.class);
  33.          return flag;
  34.     }
  35. }

5、 【microcloud-consumer-80】编写启动程序类


   
  1. package cn.study.microcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public  class Consumer_80_StartSpringCloudApplication {
  6.      public  static void main(String[] args) {
  7.         SpringApplication.run(Consumer_80_StartSpringCloudApplication.class,
  8.                 args);
  9.     }
  10. }

6、 修改 hosts 配置文件,追加访问控制路径:

127.0.0.1 client.com

7、 进行代码测试调用:

调用数据返回:

http://client.com/consumer/dept/get?id=1;

测试列表数据:

http://client.com/consumer/dept/list;

测试数据增加:

http://client.com/consumer/dept/add?dname=WEB 测试

感兴趣的开发者小伙伴都可以尝试一下这个方法,或许能让你找到一些新的灵感。也可以在评论区和我们一起讨论你的想法~

本文由作者首发于 CSDN 博客,原文链接:

https://blog.csdn.net/springML/article/details/88039134?ops_request_misc=&request_id=&biz_id=&utm_source=distribute.pc_search_result.none-task-blog-blog_SOBAIDUEND-9

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调研》,只需2分钟,便可收获价值299元的「AI开发者万人大会」在线直播门票!


   
  1. 推荐阅读:小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!
  2. 你知道吗?其实 Oracle 直方图自动统计算法存在这些缺陷!(附验证步骤)
  3. 详解以太坊虚拟机(EVM)的数据存储机制
  4. 比特币当赎金,WannaRen 勒索病毒二度来袭!平台抗住日访问量 7 亿次,研发品控流程全公开“手把手撕LeetCode题目,扒各种算法套路的裤子”北京四环堵车引发的智能交通大构想从Ngin到Pandownload,程序员如何避免面向监狱编程?
  5. 真香,朕在看了!

转载:https://blog.csdn.net/FL63Zv9Zou86950w/article/details/105591531
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场