zoukankan      html  css  js  c++  java
  • springboot创建一个服务,向eureka中注册,使用swagger2进行服务管理

    首先pom.xml文件,spring boot、springcloud版本很麻烦,容易出问题

    <?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>com.xing</groupId>
        <artifactId>springboot-user</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
    
        <name>springboot-user</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
        
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                     <version>Camden.SR3</version><!--Edgware.SR4  Finchley.RELEASE -->
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    <!--     <dependencyManagement> -->
    <!--         <dependencies> -->
    <!--             <dependency> -->
    <!--                 <groupId>org.springframework.cloud</groupId> -->
    <!--                 <artifactId>spring-cloud-starter-parent</artifactId> -->
    <!--                 <version>Edgware.SR2</version> -->
    <!--                 <type>pom</type> -->
    <!--                 <scope>import</scope> -->
    <!--             </dependency> -->
    <!--         </dependencies> -->
    <!--     </dependencyManagement> -->
        
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.1</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-joda</artifactId>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.module</groupId>
                <artifactId>jackson-module-parameter-names</artifactId>
            </dependency>
            <!-- 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.2.5</version>
            </dependency>
            <!-- alibaba的druid数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.9</version>
            </dependency>
            <!-- Swagger2的   -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.8.0</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.8.0</version>
            </dependency>
            <!--添加fastjson依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.7</version>
            </dependency>
            <!-- 热部署 --> 
    <!--         <dependency> -->
    <!--             <groupId>org.springframework.boot</groupId> -->
    <!--             <artifactId>spring-boot-devtools</artifactId> -->
    <!--             <optional>true</optional> -->
    <!--         </dependency> -->
            <!-- eureka依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
            </dependency>
            <!-- 用于注册中心账号登录 -->
    <!--         <dependency> -->
    <!--             <groupId>org.springframework.boot</groupId> -->
    <!--             <artifactId>spring-boot-starter-security</artifactId> -->
    <!--         </dependency> -->
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <!-- 热部署配置  -->
    <!--                 <configuration> -->
    <!--                     <fork>true</fork> -->
    <!--                 </configuration> -->
                </plugin>
                <!-- mybatis generator 自动生成代码插件 -->
    <!--             <plugin> -->
    <!--                 <groupId>org.mybatis.generator</groupId> -->
    <!--                 <artifactId>mybatis-generator-maven-plugin</artifactId> -->
    <!--                 <version>1.3.2</version> -->
    <!--                 <configuration> -->
    <!--                     <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> -->
    <!--                     <overwrite>true</overwrite> -->
    <!--                     <verbose>true</verbose> -->
    <!--                 </configuration> -->
    <!--             </plugin> -->
                
            </plugins>
        </build>
        <!-- 配置多个实例  -->
        <profiles>
            <profile>
                <id>first</id>
                <activation>
                    <!--  默认激活 -->
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <spring.profiles.active>first</spring.profiles.active>
                </properties>
            </profile>
            <profile>
                <id>second</id>
                <properties>
                    <spring.profiles.active>second</spring.profiles.active>
                </properties>
            </profile>
        </profiles>
    
    </project>

    此处为了实现负载均衡,所以采用多实例运行在不同端口模拟集群的方式。所以配置多个yml文件(eclipse需配置多个yml,IDEA不需要,IDEA可以动态传入参数,多端口启动)

    application.yml如下:

    spring:
      profiles:
        active: first

    application-first.yml如下:

    server: 
      port: 8070
    
    
    spring:
        application:
          name: xing-user #指定服务名
        datasource:
            name: test
            type: com.alibaba.druid.pool.DruidDataSource
            #druid相关配置
            druid:
              #监控统计拦截的filters
              filters: stat
              driver-class-name: com.mysql.jdbc.Driver
              #基本属性
              url: jdbc:mysql://192.168.***.***:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
              username: root
              password: root
              #配置初始化大小/最小/最大
              initial-size: 1
              min-idle: 1
              max-active: 20
              #获取连接等待超时时间
              max-wait: 60000
              #间隔多久进行一次检测,检测需要关闭的空闲连接
              time-between-eviction-runs-millis: 60000
              #一个连接在池中最小生存的时间
              min-evictable-idle-time-millis: 300000
              validation-query: SELECT 'x'
              test-while-idle: true
              test-on-borrow: false
              test-on-return: false
              #打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
              pool-prepared-statements: false
              max-pool-prepared-statement-per-connection-size: 20
              
    eureka:
      client:
        registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
        fetchRegistry:  true  #是否从Eureka中获取注册信息,默认为true
        serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
          defaultZone: http://xing-eurekaServer:8090/eureka/
        eurekaServerConnectTimeoutSeconds: 60
        eurekaServerReadTimeoutSeconds: 60
      instance:
        prefer-ip-address: true  #将自己的ip地址注册到Eureka服务中
        ip-address: 127.0.0.1
        instance-id: xing-user:8070 #指定实例id
        lease-expiration-duration-in-seconds: 30 #续约更新时间间隔(默认30秒)
        lease-renewal-interval-in-seconds: 10 # 续约到期时间(默认90秒)
        leaseRenewalIntervalInSeconds: 10 #心跳时间
        hostname: xing-user 
        
                 
    ## 该配置节点为独立的节点,有很多同学容易将这个配置放在spring的节点下,导致配置无法被识别
    #mybatis:
    #  mapper-locations: classpath:mapper/*.xml  #注意:一定要对应mapper映射xml文件的所在路径
    #  type-aliases-package: com.winterchen.model  # 注意:对应实体类的路径
    
    #pagehelper
    pagehelper:
        helperDialect: mysql
        reasonable: true
        supportMethodsArguments: true
        params: count=countSql
        returnPageInfo: check

    application-second.yml 如下:

    server: 
      port: 8071
    
    
    spring:
        application:
          name: xing-user #指定服务名
        datasource:
            name: test
            type: com.alibaba.druid.pool.DruidDataSource
            #druid相关配置
            druid:
              #监控统计拦截的filters
              filters: stat
              driver-class-name: com.mysql.jdbc.Driver
              #基本属性
              url: jdbc:mysql://192.168.254.128:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
              username: root
              password: root
              #配置初始化大小/最小/最大
              initial-size: 1
              min-idle: 1
              max-active: 20
              #获取连接等待超时时间
              max-wait: 60000
              #间隔多久进行一次检测,检测需要关闭的空闲连接
              time-between-eviction-runs-millis: 60000
              #一个连接在池中最小生存的时间
              min-evictable-idle-time-millis: 300000
              validation-query: SELECT 'x'
              test-while-idle: true
              test-on-borrow: false
              test-on-return: false
              #打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
              pool-prepared-statements: false
              max-pool-prepared-statement-per-connection-size: 20
              
    eureka:
      client:
        registerWithEureka: true #是否将自己注册到Eureka服务中,默认为true
        fetchRegistry:  true  #是否从Eureka中获取注册信息,默认为true
        serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址
          defaultZone: http://xing-eurekaServer:8091/eureka/
        eurekaServerConnectTimeoutSeconds: 60
        eurekaServerReadTimeoutSeconds: 60
      instance:
        prefer-ip-address:  true  #将自己的ip地址注册到Eureka服务中
        ip-address: 127.0.0.1
        instance-id: xing-user:8071 #指定实例id
        lease-expiration-duration-in-seconds: 30 #续约更新时间间隔(默认30秒)
        lease-renewal-interval-in-seconds: 10 # 续约到期时间(默认90秒)
        leaseRenewalIntervalInSeconds: 10 #心跳时间
        hostname: xing-user         
    ## 该配置节点为独立的节点,有很多同学容易将这个配置放在spring的节点下,导致配置无法被识别
    #mybatis:
    #  mapper-locations: classpath:mapper/*.xml  #注意:一定要对应mapper映射xml文件的所在路径
    #  type-aliases-package: com.winterchen.model  # 注意:对应实体类的路径
    
    #pagehelper
    pagehelper:
        helperDialect: mysql
        reasonable: true
        supportMethodsArguments: true
        params: count=countSql
        returnPageInfo: check

    先整体看一下项目结构:

    先创建一个实体类user.java:

    U
    package com.xing.user.entity;
    
    import java.io.Serializable;
    
    public class User implements Serializable{
        // @Fields serialVersionUID : TODO
        private static final long serialVersionUID = 1L;
        private int id;
        private String name;
        private String nameEn;
        private int age;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getNameEn() {
            return nameEn;
        }
        public void setNameEn(String nameEn) {
            this.nameEn = nameEn;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", nameEn=" + nameEn + ", age=" + age + "]";
        }
        public User(String name, String nameEn, int age) {
            super();
            this.name = name;
            this.nameEn = nameEn;
            this.age = age;
        }
        public User() {
            super();
        }
        
    }
    ser.java

    创建mapper,我这里直接使用注解方式,没有使用xml方式

    package com.xing.user.dao;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import com.xing.user.entity.User;
    
    @Mapper
    public interface UserMapper {
         //这里的表名区分大小写 
         @Select("SELECT * FROM user WHERE NAME = #{name}")
         User selectByName(@Param("name") String name);
         
         @Insert("insert into user (name,nameEn,age) value (#{name},#{nameEn},#{age})")
         int insertUser(@Param("name") String name ,@Param("nameEn") String nameEn ,@Param("age") int age);
    
    }
    UserMapper

    创建service

    package com.xing.user.service;
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.xing.user.dao.UserMapper;
    import com.xing.user.entity.User;
    
    @Service
    public class UserService {
        
        @Autowired
        private UserMapper userMapper;
            
        @Transactional
        public User findByName(String name) {
            return userMapper.selectByName(name);
        }
    }
    UserService

    创建controller

    package com.xing.user.contorller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.http.MediaType;
    import com.xing.user.entity.User;
    import com.xing.user.service.UserService;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiImplicitParam;
    import io.swagger.annotations.ApiOperation;
    import io.swagger.annotations.ApiResponse;
    import io.swagger.annotations.ApiResponses;
    
    @RestController
    @Api(tags="用户接口", produces = MediaType.APPLICATION_JSON_VALUE) 
    @RequestMapping("/user")
    public class UserController {
        
        @Autowired
        private UserService userService;
        
        @ApiOperation(value = "查询用户", notes = "查询用户")//方法说明
    //    @ApiResponses({ @ApiResponse(code = CommonStatus.OK, message = "操作成功"),
    //        @ApiResponse(code = CommonStatus.EXCEPTION, message = "服务器内部异常"),
    //        @ApiResponse(code = CommonStatus.FORBIDDEN, message = "权限不足") })
        @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = User.class)})//响应数据说明,可以有多个
        @ApiImplicitParam(name = "name", value = "用户名", paramType = "path", required = true, dataType = "String")
        //produces = { "application/json;charset=UTF-8" } 这段代码是因为集成了EurekaServer,又需要jackson-dataformat-xml这个依赖,如果不设置这段代码,会返回xml格式,而不是json
        @GetMapping(value = "/findByName/{name}",produces = { "application/json;charset=UTF-8" })
        public User findByName(@PathVariable String name) {
            System.out.println("----------------------------"+name);
            return userService.findByName(name);
        }
    }
    UserController

    增加SwaggerConfig,使用 swagger2管理RestFul API配置swagger2

    package com.xing.user.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.context.request.async.DeferredResult;
    
    import com.google.common.base.Predicate;
    import com.google.common.base.Predicates;
    
    import io.swagger.annotations.ApiOperation;
    import springfox.documentation.builders.ApiInfoBuilder;
    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.service.Contact;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    /**
     */
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .enableUrlTemplating(true)
                    .select()
                    // 扫描所有有注解的api,用这种方式更灵活
                    .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                    .paths(PathSelectors.any())
                    .build();
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("webapp接口文档")
                    .description("章建星test接口,简单接口服务管理!")
                    .termsOfServiceUrl("https://www.baidu.com")
                    .contact(new Contact("struggling_rong", "https://www.baidu.com", "1743719440@qq.com"))
                    .version("1.0.0")
                    .build();
        }
    }
    SwaggerConfig

    配置好swagger可以看到swagger2的页面如下:

    去eureka界面查看服务已经注册成功

     

    服务也能正常工作,致此,简单的一个一个服务注册和管理就完成了

    源码地址:https://github.com/OnlyXingxing/SpringCloud

  • 相关阅读:
    Ext.grid.column.Column主要配置项及示例
    Ext.grid.Panel主要配置及示例
    EF Code First关系规则及配置
    ExtJS4系列目录
    EF Code First数据库连接配置
    ASP.NET MVC系列:ASP.NET MVC简介
    Ext JS下载及配置
    Ext.container.Viewport
    Ext.tab.Panel页签
    ASP.NET MVC系列:Controller/Action
  • 原文地址:https://www.cnblogs.com/xing-12/p/9876358.html
Copyright © 2011-2022 走看看