Golang开发环境配置

2019-02-19

现如今Go语言的开发阵容可以说是空前强大,且背靠Google这棵大树,又不乏牛人坐镇,是名副其实的“牛二代”。 image.png   有关Go语言特性优缺点本文就不在赘述了,百度上一大堆。 

下载SDK

本文使用macOS操作系统为例,其他系统操作大同小异

下载地址:https://golang.org/dl/ image.png

安装SDK

双击下载后的pkg进行安装,安装成功后,打开终端,输入下面命令查看是否安装成功 image.png

环境变量配置

export GOPATH=/Users/wuwenze/Development/GoProjects
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
阅读全文...

在macOS home目录下创建文件夹

2019-02-12

mac 是基于unix, 自带就有home目录,但是为空。home目录的默认所属用户是root wheel,mac默认的root账号所属用户是root admin,所以root也无法在home目录下创建文件夹。如果非要使用home目录,下面会详细说明(备注:个人不建议使用home目录)

修改auto_master

$ sudo vim /etc/auto_master 
# 
# Automounter master map 
# 
+auto_master        # Use directory service 
/net            -hosts      -nobrowse,hidefromfinder,nosuid 
#/home          auto_home   -nobrowse,hidefromfinder   //注释掉本行 
/Network/Servers    -fstab 
/-          -static 

加载auto_master

$ cd /    //必须切换到根目录 
$ sudo automount  //必须在根目录下执行 

创建目录与修改权限

$ sudo mkdir /home/test //创建目录 
$ cd /home 
$ sudo chown wuwenze.staff -R test  //修改文件所属 
$ ls -l /home/ 
total 0 
dr-xr-xr-x 7 root wheel 238 2 26 17:48 ./ 
drwxr-xr-x 30 root wheel 1088 8 30 17:28 ../ 
drwxr-xr-x 2 wuwenze staff 68 2 26 17:45 test/ 
阅读全文...

解决Updating Homebrew问题

2019-02-06

在国内的网络环境下使用 Homebrew 安装软件的过程中可能会长时间卡在 Updating Homebrew 这个步骤。

image.png

每次执行brew install命令时,会尝试更新Homebrew,但是由于众所周知的原因,这一步被挡在了墙外,本文有两种方式可解决此问题。

临时解决

出现此提示时,轻按Control + C命令终止更新操作。

~ brew install macvim
Updating Homebrew...
^C==> Satisfying dependencies
==> ....

这个方法是临时性的,每次都去按一下也是神烦。

使用Alibaba加速镜像

1) 替换/还原 brew.git 仓库地址

# 替换成阿里巴巴的 brew.git 仓库地址:
cd "$(brew --repo)"
git remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git

#=======================================================

# 还原为官方提供的 brew.git 仓库地址
cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git

2) 替换/还原 homebrew-core.git 仓库地址

# 替换成阿里巴巴的 homebrew-core.git 仓库地址:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git

#=======================================================

# 还原为官方提供的 homebrew-core.git 仓库地址
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://github.com/Homebrew/homebrew-core.git

3) 替换/还原 homebrew-bottles 访问地址

这个步骤跟你的 macOS 系统使用的 shell 版本有关系,所以,先来查看当前使用的 shell 版本:

echo $SHELL
# /bin/zsh or /bin/bash

3.1) zsh 终端操作方式

# 替换成阿里巴巴的 homebrew-bottles 访问地址:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

#=======================================================

# 还原为官方提供的 homebrew-bottles 访问地址
vi ~/.zshrc
# 然后,删除 HOMEBREW_BOTTLE_DOMAIN 这一行配置
source ~/.zshrc

3.2) bash 终端操作方式

# 替换 homebrew-bottles 访问 URL:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile

#=======================================================

# 还原为官方提供的 homebrew-bottles 访问地址
vi ~/.bash_profile
# 然后,删除 HOMEBREW_BOTTLE_DOMAIN 这一行配置
source ~/.bash_profile
阅读全文...

Swagger2在SpringBoot中的集成指南

2019-01-28

引入依赖Swagger2及Swagger2 UI

<!-- swagger -->
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger2</artifactId>
  <version>2.7.0</version>
</dependency>
<!-- swagger-ui -->
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger-ui</artifactId>
  <version>2.7.0</version>
</dependency>

构建配置文件(基于JavaConfig)

package com.wuwenze.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;

/**
 * @author wuwenze
 * @date 2019/1/28
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

  @Bean
  public Docket createRestApi() {
    return new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo())
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.wuwenze.api"))
        .paths(PathSelectors.any())
        .build();
  }

  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
        .title("某电商平台在线API文档")
        .description("这是详细描述详细描述详细描述详细描述详细描述详细描述")
        .contact(new Contact("吴汶泽", "https://wuwenze.com",
            "wenzewoo@gmail.com"))
        .version("1.0")
        .build();
  }
}
阅读全文...

将JAR包发布到Maven Sonatype OSSRH中央仓库

2019-01-24

将jar包发布到Maven中央仓库(https://search.maven.org/) 供广大开发者使用,流程比较繁琐,遂成此文记录。

image

Maven中央仓库并不支持直接上传Jar包。因此需要将jar包发布到一些指定的第三方Maven仓库,然后该仓库再将Jar包同步到Maven中央仓库。

本文使用最简单的方式,通过发布到Sonatype OSSRH (https://central.sonatype.org/pages/ossrh-guide.html) 仓库的方式来实现。

注册JIRA账号

JIRA是一个项目管理服务,类似于国内的Teambition。Sonatype通过JIRA来管理OSSRH仓库。

注册地址:https://issues.sonatype.org/secure/Signup!default.jspa

需要填写Email, Full Name, Username以及password,其中Username与Password后面的步骤需要用到(重要)

阅读全文...

SpringBoot Admin 集成指南(v2.1.1)

2019-01-11

SpringBoot Admin用于管理和监控SpringBoot应用程序。 应用程序作为Spring Boot Admin Client向为Spring Boot Admin Server注册(通过HTTP)或使用SpringCloud注册中心(例如Eureka,Consul)发现。

其常见的功能如下:

  • 显示健康状况
  • 显示详细信息,例如
    • JVM和内存指标
    • micrometer.io指标
    • 数据源指标
    • 缓存指标
  • 显示构建信息编号
  • 关注并下载日志文件
  • 查看jvm系统和环境属性
  • 查看Spring Boot配置属性
  • 支持Spring Cloud的postable / env-和/ refresh-endpoint
  • 轻松的日志级管理
  • 与JMX-beans交互
  • 查看线程转储
  • 查看http跟踪
  • 查看auditevents
  • 查看http-endpoints
  • 查看计划任务
  • 查看和删除活动会话(使用spring-session)
  • 查看Flyway / Liquibase数据库迁移
  • 下载heapdump文件
  • 状态变更通知(通过电子邮件,Slack,Hipchat,……)
  • 状态更改的事件日志(非持久性)

开始使用

创建SpringBoot AdminServer

建立标准的Maven项目,其完整的依赖如下:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wuwenze</groupId>
    <artifactId>admin-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>admin-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-admin.version>2.1.1</spring-boot-admin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-dependencies</artifactId>
                <version>${spring-boot-admin.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
阅读全文...

开发一个JMeter插件(CsvWriterPostProcessor)

2019-01-04

虽然JMeter自带的插件基本能满足大多数场景,但有时候也需要自定义一些插件来实现。网上的JMeter的插件开发文档稀少,通过本人的一些尝试,总结了一些JMeter插件开发相关的经验。

JMeter的核心组件

  • Timer 定时器,用于配置每次sampling之间的等待时间。
  • Sampler 取样器,如果是其他的协议需要实现其他协议的Sampler。
  • ConfigElement 配置组件,主要用于定义前置配置。如数据库连接,csv输入数据集等。
  • Assertion 断言,验证Sampler的结果是否符合预期。
  • PostProcessor 后置处理器,一般用于对Sampler结果进行二次加工。
  • Visualizer 将sampler的结果进行可视化展示。
  • Controller 对sampler进行逻辑控制。
  • SampleListener 监听器,一般用于保存sampler的结果等耗费时间的操作。

JMeter插件加载机制

通过阅读JMeter源码发现,它的加载插件机制是相当简单的,扫描扩展下的的所有实现了JMeterGUIComponent和TestBean接口的类,然后进行初始化。

ClassFinder.findClassesThatExtend(
	JMeterUtils.getSearchPaths(), 
	new Class[] {JMeterGUIComponent.class, TestBean.class }

所以只要确保插件的jar包在扩展路径下即可,默认路径是: JMETER_HOME/lib/ext

JMeter的GUI机制

JMeter是基于Swing实现的,咱们直接继承JMeterGUIComponent接口的抽象实现类即可:

org.apache.jmeter.config.gui.AbstractConfigGui
org.apache.jmeter.assertions.gui.AbstractAssertionGui
org.apache.jmeter.control.gui.AbstractControllerGui
org.apache.jmeter.timers.gui.AbstractTimerGui
org.apache.jmeter.visualizers.gui.AbstractVisualizer
org.apache.jmeter.samplers.gui.AbstractSamplerGui
org.apache.jmeter.processor.gui.AbstractPostProcessorGui
...

image

阅读全文...

Intellij IDEA如何远程调试

2018-12-30

一般情况下,对于分布式系统的调试还是比较麻烦的,比较常见的方式是在远程调用的过程中通过不断的打印log,然后重新部署上线、调试、定位问题,实在是过于麻烦。

实际上Java是支持远程调试的,只是大家平时没有怎么用过罢了,本文通过Intellij IDEA为例讲解如何来使用远程调试。

准备测试程序

@GetMapping("/list")
public ResponseEntity<?> list() {
    List<String> arrayList = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
        arrayList.add(String.format("arrayList_item_%s", i));
    }
    return ResponseEntity.ok(arrayList);
}

这个程序很简单,就是循环生成ArrayList对象罢了。

使用特定的JVM参数启动程序

将程序上传到服务器(10.211.55.5)上后,使用相关的JVM参数启动程序:

-Xdebug -Xrunjdwp:transport=dt_socket,address=${debugger_port},server=y,suspend=n

其中,${debugger_port}代表开启远程调试的端口,开启完毕后,要注意防火墙相关的配置

java -D -Xdebug -Xrunjdwp:transport=dt_socket,address=9012,server=y,suspend=n -jar springboot-test-0.0.1-SNAPSHOT.jar
阅读全文...