首页 » 文章

spring boot 引入swagger可以方便的测试api和查看api文档
1.引入依赖
 <!-- Swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.8.0</version>
        </dependency>
 
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.8.0</version>
        </dependency>

2.加入SwaggerConfig.java

package tv.rr.panther.base.config;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import tv.rr.panther.base.util.PropertiesUtil;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * @title
 * @description
 * @usage

 * @author shenfeng
 * @create 2018/2/12 10:14
 */
 
@Profile({"dev","qtest"})
 
@Configuration
@EnableSwagger2
@ComponentScan
@EnableWebMvc
public class SwaggerConfig {
 
    private static final String SWAGGER_FLAG = PropertiesUtil.getPropertyValue("application", "swagger.enable");
 
    @Bean
    public Docket api(){
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                .enable(true)
                .globalOperationParameters(getGlobalHeaderParameters())
                .apiInfo(apiInfo());
    }
 
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("拍客")
                .description("paike接口文档")
                .version("1.0.0")
                .build();
    }
 
    private List<Parameter> getGlobalHeaderParameters() {
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        List<Parameter> parameters = new ArrayList<>(3);
        parameterBuilder.name("appId").description("客户端version_Platform")
                .modelRef(new ModelRef("string"))
                .parameterType("header").required(true).defaultValue("3.7.0_ios");
 
        parameterBuilder.name("token").description("客户端version_Platform")
                .modelRef(new ModelRef("string"))
                .parameterType("header").required(true).defaultValue("a261fdc8ddab4e8b8b233d9d011da442");
 
        parameters.add(parameterBuilder.build());
        parameterBuilder.name("sign").description("客户端签名md5(timestamp+token+appId)")
                .modelRef(new ModelRef("string"))
                .parameterType("header").required(true).defaultValue("md5(12132345645_token_3.7.2_ios)");
        parameters.add(parameterBuilder.build());
        return parameters;
    }
 
}

3.在controller上贴注解吧

package tv.rr.panther.controller;
 
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import tv.rr.panther.base.controller.BaseController;
import tv.rr.panther.base.view.CommonResult;
import tv.rr.panther.responseData.tag.SelectTagListResponseData;
import tv.rr.panther.responseData.tag.TagListResponseData;
import tv.rr.panther.service.TagService;
import tv.rr.panther.view.TagView;
import tv.rr.panther.view.TagViewNoPic;
 
import java.util.List;
 
/**
 * @title
 * @description
 * @usage
 * @author shenfeng
 * @create 4/28/2018 3:36 PM
 *
 *                             _ooOoo_
 *                            o8888888o
 *                            88" . "88
 *                            (| -_- |)
 *                            O\  =  /O
 *                         ____/`---'\____
 *                       .'  \\|     |//  `.
 *                      /  \\|||  :  |||//  \
 *                     /  _||||| -:- |||||-  \
 *                     |   | \\\  -  /// |   |
 *                     | \_|  ''\---/''  |   |
 *                     \  .-\__  `-`  ___/-. /
 *                   ___`. .'  /--.--\  `. . __
 *                ."" '<  `.___\_<|>_/___.'  >'"".
 *               | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 *               \  \ `-.   \_ __\ /__ _/   .-` /  /
 *          ======`-.____`-.___\_____/___.-`____.-'======
 *                             `=---='
 *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 *                     佛祖保佑        永无BUG
 */
@RequestMapping("tag")
@Api
@Controller
public class TagController extends BaseController {
 
    @Autowired
    private TagService tagService;
 
    @RequestMapping("recommendList")
    @ApiOperation(value = "首页推荐标签列表",httpMethod = "GET")
    @ResponseBody
    public CommonResult<TagListResponseData> recommondList(){
        CommonResult<TagListResponseData> result = CommonResult.getInstance();
        TagListResponseData tagListResponseData = new TagListResponseData();
        List<TagView> list = tagService.recommendList();
        tagListResponseData.setTagList(list);
        result.setData(tagListResponseData);
        return result;
    }
 
    /**
     * 可选列表,目前是所有的
     * @return
     */
    @RequestMapping("selectList")
    @ApiOperation(value = "视频可选标签",httpMethod = "GET")
    @ResponseBody
    public CommonResult<SelectTagListResponseData> selectList(){
        CommonResult<SelectTagListResponseData> result = CommonResult.getInstance();
 
        SelectTagListResponseData selectTagListResponseData = new SelectTagListResponseData();
 
        List<TagViewNoPic> list = tagService.allList();
        selectTagListResponseData.setTagList(list);
        result.setData(selectTagListResponseData);
 
        return result;
    }
 
}
  1. WebAppConfig 中web mvc注册路径
package tv.rr.panther.base.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
/**
 * @title
 * @description
 * @usage
 * @author shenfeng
 * @create 2018/2/12 10:19
 */
@Profile({"dev","qtest"})
@Configuration
@EnableWebMvc
public class WebAppConfig extends WebMvcConfigurerAdapter {
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
 
}

windows 下启动mysql比较麻烦,用命令行安装成mysql服务,然后启动服务来运行mysql

1.首先下载解压mysql--- https://dev.mysql.com/downloads/mysql/ ,解压后在根目录下创建mysql.ini,注意这里好多教程都没说明,路径要用双引号,否则win10报错

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8 
[mysqld]
# 设置3306端口
port = 3306 
# 设置mysql的安装目录
basedir="E:\\baiduDown\\mysql-5.7.29-winx64"
datadir="E:\\baiduDown\\mysql-5.7.29-winx64\\data"
# 允许最大连接数
max_connections=200
# 设置mysql服务端默认字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB 
# 注意这个参数,MySQL默认值导致在Windows 10 专业版上无法安装
innodb_flush_method=normal

2.管理员模式命令行执行下面的指令,注意执行的路径必须是mysql所在路径

mysqld.exe --initialize-insecure  --explicit_defaults_for_timestamp
mysqld.exe --install 

3.启动mysql服务

net start mysql

目前遇到一个需求,需要用fiddler抓取idea插件的http请求。

解决办法,在idea64.exe.vmoptions和idea.exe.vmoptions加入下面的配置


-DproxySet=true
-Dhttp.proxyHost=127.0.0.1
-Dhttp.proxyPort=8888

最近研究http协议,对TCP/IP分层和做下对比,不得不说tcp/ip的设计者真的聪明,用分治的方法来处理复杂的网络处理。

1.TCP/IP分层可以总结为:应用层(如http,一般绑定到端口)向传输层(TCP)层要连接,传输层向IP层要ip路由,IP层向链路层要mac地址寻址。反之亦然。

  • 应用层(http,stmp)
  • 数据传输层(tcp,udp)
  • 网络层(ip)
  • 链路层(mac)
  1. OSI 是为了统一标准设计的
  • 应用层
  • 表示层
  • 会话层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层(光缆,网线)

我们可以这么理解,tcp/ip去掉了下面物理层,合并了上面的3层

最近看java 代码优化,总结下java 代码常见调优策略

1.优化代码

  • 比如不要for循环来访问linkedlist,使用iterator

2.优化设计

  • 比如使用单例设计模式来优化对象的创建

3.优化算法

  • 这个可以去研究算法了,提高代码的执行效率

4.时间换空间

  • 空间要求苛刻的场景,不追求时间,节约空间-----比如String.intern,解决字符串的存储空间,访问上略微降低了效率

5.空间换时间

  • mysql的分库分表,也可以理解成一种空间换时间。mysql超过千万级,就会出现读写速度变慢。

6.参数调优

  • 针对业务场景,调节系统,jvm,servlet容器参数,比如直接将大对象放入老年代。

总结:调优策略只是其中一环,上线前我们要做性能基准测试(benchmark)--->自下而上排查性能问题--->确定调优策略(此文种的6种)--->除了调优,还要兜底,因为再怎么调,我们系统也是有极限的,那么兜底策略有限流熔断,还有扩容(根据流量实时扩容,或者预测性提前扩容,比如秒杀活动时,提前扩容。)