0%

启动及常用配置项

解压后,在目录下打开cmd窗口,运行

consul agent -dev -ui -node=nodeName

-data-dir

  • 作用:指定agent储存状态的数据目录
  • 这是所有agent都必须的
  • 对于server尤其重要,因为他们必须持久化集群的状态

-config-dir

  • 作用:指定service的配置文件和检查定义所在的位置
  • 通常会指定为”某一个路径/consul.d”(通常情况下,.d表示一系列配置文件存放的目录)

-config-file

  • 作用:指定一个要装载的配置文件
  • 该选项可以配置多次,进而配置多个配置文件(后边的会合并前边的,相同的值覆盖)

-dev

  • 作用:创建一个开发环境下的server节点
  • 该参数配置下,不会有任何持久化操作,即不会有任何数据写入到磁盘
  • 这种模式不能用于生产环境(因为第二条)

-node

  • 作用:指定节点在集群中的名称
  • 该名称在集群中必须是唯一的(默认采用机器的host
  • 推荐:直接采用机器的IP

-bind

  • 作用:指明节点的IP地址
  • 有时候不指定绑定IP,会报Failed to get advertise address: Multiple private IPs found. Please configure one. 的异常

-server

  • 作用:指定节点为server
  • 每个数据中心(DC)的server数推荐至少为1,至多为5
  • 所有的server都采用raft一致性算法来确保事务的一致性和线性化,事务修改了集群的状态,且集群的状态保存在每一台server上保证可用性
  • server也是与其他DC交互的门面(gateway)

-bootstrap-expect

  • 作用:该命令通知consul server我们现在准备加入的server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的server节点成功的加入后启动。

-join

  • 作用:将节点加入到集群

-datacenter(老版本叫-dc,-dc已经失效)

  • 作用:指定机器加入到哪一个数据中心中

-client

  • 作用:指定节点为client,指定客户端接口的绑定地址,包括:HTTP、DNS、RPC
  • 默认是127.0.0.1,只允许回环接口访问
  • 若不指定为-server,其实就是-client

测试

浏览器访问http://127.0.0.1:8500
consul

启动命令

docker run "image"
参数 用途
-it 交互式启动
-d 后台启动
-p80:80 端口映射
--name 容器名称
--cpus 限制cpu使用个数
--cpuset-cpus 限制cpu使用的核,例如0-3,限制使用0-3核CPU
-m 限制内存使用,例如2048M
--restart 自动重启策略

对指定容器执行bash

docker exec -it 9df70f9a0714 /bin/bash

删除镜像

docker rmi 镜像名/镜像ID

构建镜像

FROM myjdk1.8
MAINTAINER author
 
ADD haolin.jar /root
ADD start.sh /root
RUN chmod +x /root/start.sh
 
EXPOSE 80
ENV LANG C.UTF-8
CMD /root/start.sh
#! /bin/bash
echo "building docker image..."
docker build -f /docker/bbs/Dockerfile -t author/bbs .
 
echo "stop and remove old docker container"
if [ `docker ps -a|grep bbs|awk '{print $1}'` != '' ]; then
        docker stop bbs
        docker rm bbs
fi
 
echo "start..."
docker run -d -p 80:80 --name bbs --restart=always author/bbs:latest
 
echo "buid success"

首先开启gateway debug日志,可以看到:

debug

debug日志中是可以打印请求所命中的路由id的,Route matched: hello-route

然后我在想怎么在程序中获取到这个id呢?因为如果在程序中可以获取到这个id,我就可以按统计每个路由所被访问的次数。网上找了一些博客,都没有提到这个问题,所以只能自己想了。

首先我从打印日志的类开始搜,打开源码RoutePredicateHandlerMapping,找到打印日志的代码。

protected Mono<?> getHandlerInternal(ServerWebExchange exchange) {
    if (this.managmentPort != null && exchange.getRequest().getURI().getPort() == this.managmentPort) {
        return Mono.empty();
    } else {
        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_HANDLER_MAPPER_ATTR, this.getSimpleName());
        return this.lookupRoute(exchange).flatMap((r) -> {
            exchange.getAttributes().remove(ServerWebExchangeUtils.GATEWAY_PREDICATE_ROUTE_ATTR);
            if (this.logger.isDebugEnabled()) {
                // 可以看到这里对应的r就是我们要获取的路由。因为从打印的日志中可以看出
                this.logger.debug("Mapping [" + this.getExchangeDesc(exchange) + "] to " + r);
            }

            exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, r);
            return Mono.just(this.webHandler);
        }).switchIfEmpty(Mono.empty().then(Mono.fromRunnable(() -> {
            exchange.getAttributes().remove(ServerWebExchangeUtils.GATEWAY_PREDICATE_ROUTE_ATTR);
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("No RouteDefinition found for [" + this.getExchangeDesc(exchange) + "]");
            }

        })));
    }
}
Route{id='hello-route', uri=http://127.0.0.1:8763, order=0, predicate=org.springframework........

我们只要获取到这个Route对象就可以了。那么源码中这个对象放哪儿了呢?

exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR, r);

所以我们只需要在exchange中根据ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR,这个keyAttributes获取就可以了。

下面编写一个Global Filter试试吧。

public class GatewayLogFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        Route route = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
        System.out.println(route.getId());
        return chain.filter(exchange);
    }

}

安装git

git -v

安装nodejs

node -v
npm -v
npm config set registry https://registry.npm.taobao.org

安装hexo

npm install -g hexo-cli
hexo init MyBlog
cd MyBlog      //进入这个MyBlog文件夹
npm install

生成SSH添加到GitHub

详细的百度~

git config --global user.name "yourname"
git config --global user.email "youremail"

安装一些插件

上传到GitHub上需要的插件

npm install hexo-deployer-git --save

matery主题需要的插件

npm i -S hexo-prism-plugin
npm install hexo-generator-search --save
npm i hexo-permalink-pinyin --save
npm i --save hexo-wordcount
npm install hexo-filter-github-emojis --save
npm install hexo-generator-feed --save

SpringCloud 2.0.0版本以前,只要加入下面依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

并且在类上,变量上打上@RefreshScope的注解,在启动的时候,都会看到

RequestMappingHandlerMapping : Mapped "{/refresh,methods=[post]}" 

也就是SpringCloud暴露了一个接口 /refresh 来给我们去刷新配置,但是SpringCloud 2.0.0以后,有了改变.
我们需要在bootstrap.yml里面加上需要暴露出来的地址

management:
  endpoints:
    web:
      exposure:
        include: refresh,health

现在的地址也不是/refresh了,而是/actuator/refresh

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

$ hexo new "My New Post"

More info: Writing

Run server

$ hexo server

More info: Server

Generate static files

$ hexo generate

More info: Generating

Deploy to remote sites

$ hexo deploy

More info: Deployment