• Resultful分布式架构


    1.创建一个新的项目模块【micro】,该模块提供有API程序类,包括:公共接口,DTO类。

    2.创建一个DTO信息的DTO类,该类的组成和vo类结构相同。(如果说现在的项目使用的是 MyBatis,那么对于当前的DTO设计就比较鸡肋了,但是如果现在要使用的是 SpringDataJPA,那么DTO类就可以帮助使用者隐藏PO类(有一系列的重要注解)的组成结构。)

    package com.yootk.dto;
    import java.io.Serializable;
    public class DeptDTO implements Serializable {
        private  Long deptno;
        private String dname;
        private String loc;
    //setter(),getter(),toString()方法略...
    }
    

    3.【micro】修改pom文件,追加api模块的依赖配置:将micro-api定义成依赖包,方便后面在其他模块引入此模块。

    4.【micro】创建"micro-provider-dept-8001"微服务,并引入相应的依赖库。

    5.【micro-provider-dept-8001】创建描述部门的vo类,这个vo类只存活在当前的RPC服务端

    6.【micro-provider-dept-8001】修改mybatis.cfg.xml配置文件,将自动配置的别名进行包的修改:

    <package name="com.yootk.cloud.vo"/>
    

    7.【micro-provider-dept-8001】定义IDeptDAO接口,实现数据查询操作:写了三个方法

    @Mapper
    public interface IDeptDAO {
        public boolean doCreate(Dept dept);
        public List<Dept> findAll();
        public Dept findById(Long id);
    } 

    8.【micro-provider-dept-8001】创建Dept.xml配置文件,设置接口的数据操作

    9.【micro-provider-dept-8001】修改src/main/resources/application.yml配置文件,配置数据库的连接。

    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/yootk_8001
        username: root
        password: mysqladmin
        dbcp2:
          min-idle: 5
          initial-size: 3
          max-total: 5
          max-wait-millis: 100
      messages:
        basename: i18n/Message    # 定义要读取的资源文件名称
    
    
    server:
      port: 8001
    mybatis:
      config-location: classpath:mybatis/mybatis.cfg.xml  # MyBatis的核心配置文件
      mapper-locations:
        - classpath:mybatis/mapper/**/*.xml
    

    10.【micro-api】 定义IDeptService业务接口,业务接口一定是暴露在远程端的。

    package com.yootk.service;
    import com.yootk.dto.DeptDTO;
    import java.util.List;
    public interface IDeptService {
        /**
         * 执行数据的增加处理操作,增加的时候将数据保存在DTO类中
         * @param dto 包含有要增加的数据(dname,loc)
         * @return 如果增加成功返回一个不为空的DTO对象,同时将增加后的id保存在此对象之中
         */
        public DeptDTO add(DeptDTO dto);
        public List<DeptDTO> list();
        public DeptDTO get(long id);
    }
    

    11.【micro-provider-dept-8001】在具体的业务提供模块上进行IDeptService接口的实现,不要忘记采用spring内部的@Service注解

    12.【micro-provider-dept-8001】在根包下编写程序启动类:

    package com.yootk.cloud;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class StartDeptService {
        public static void main(String[] args) {
            SpringApplication.run(StartDeptService.class, args);
        }
    }
    

    13.【micro-provider-dept-8001】编写测试类,进行代码的测试处理。

    package com.yootk.cloud.test;
    import com.yootk.cloud.StartDeptService;
    import com.yootk.dto.DeptDTO;
    import com.yootk.service.IDeptService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.test.context.web.WebAppConfiguration;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @WebAppConfiguration    // 表示需要启动Web配置才可以进行测试
    @SpringBootTest(classes = StartDeptService.class)  // 定义要测试的启动类
    public class TestDeptService {
        @Autowired
        private IDeptService deptService ;
        @Test
        public void testAdd() {
            DeptDTO dto = new DeptDTO() ;
            dto.setDname("【dept-8001】测试部门名称");
            dto.setLoc("【dept-8001】测试部门位置");
            System.out.println("【部门增加测试】" + this.deptService.add(dto));
        }
        @Test
        public void testGet() {
            System.out.println("【部门ID查询测试】" + this.deptService.get(1));
        }
        @Test
        public void testList() {
            System.out.println("【部门列表测试】" + this.deptService.list());
        }
    }
    

    14.【micro-provider-dept-8001】定义一个DeptRest程序类,进行请求的处理

    package rest;
    import com.yootk.dto.DeptDTO;
    import com.yootk.service.IDeptService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    public class DeptRest {
        @Autowired
        private IDeptService deptService ;
        @PostMapping("/dept/add")
        public Object add(@RequestBody DeptDTO dto) {
            return this.deptService.add(dto) ;
        }
        @GetMapping("/dept/get/{deptno}")
        public Object get(@PathVariable("deptno") long deptno) {
            return this.deptService.get(deptno) ;
        }
        @GetMapping("/dept/list")
        public Object list() {
            return this.deptService.list() ;
        }
    }
    

    15.【windows】由于需要模拟多台主机之间的访问,所以设置不同的主机名称,修改 hosts文件:

      ● 路径:C: Windows System32 driversletchosts:127.0.0.1  dept-8001.com

      ● 访问路径:http://dept-8001.com:8001/dept/list;

    建立Boot消费端 

      本次的项目还没有在整个的程序里面启动 SpringCloud的相关配置,仅仅只是进行了 SpringBoot与Rest基本实现,在整个的SpringCloud微服务设计里面,最为核心的部分就是Rest交互,而后围绕着Rest交互产生了许多的新的依赖,本次将在“ microclient”模块里面进行Rest服务的调用,该模块运行在80端口(模拟WEB服务器)。

    16.【micro-client】创建micro-client模块并导入相应的依赖包

    17.【micro-client】创建配置类:如果要想进行Rest服务的基本调用,那么在 Spring里面提供有一个 RestTemplate的操作模版,使用这个模版可以将接收到的JSON数据自动的转为指定的对象。

    package com.yootk.boot.config;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;

    @Configuration
    public class RestfulConfig {
    @Bean
    public RestTemplate getRestTemplate() {
    return new RestTemplate() ;
    }
    }

      利用这种方式配置不管在项目之中使用多少次的 RestTemplate实际上整个的 Spring只会提供有一个对象实例,得到的好处就

    是避免对象重复的实例化所带来的GC处理问题。

    17.【micro-client】创建DeptConsumerAction程序类,进行所有服务调用:

  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/wxl123/p/11257683.html
Copyright © 2020-2023  润新知