当前位置: 首页 > 编程日记 > 正文

consul安装配置使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

环境
centos:7.3
docker:1.12.6
kernel:3.10.0-514.6.1.el7.x86_64
consul:0.8.1
server1:10.1.13.221
server2:10.1.13.222

consul的功能
·服务发现
·健康检查
·支持多数据中心
·key/value存储
consul的使用场景
·docker实例的注册与配置共享
·coreos实例的注册与配置共享
consul的优势
·使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft
·支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持
·支持健康检查. etcd 不提供此功能
·官方提供web管理界面, etcd 无此功能
·支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议
consul发现机制
当一个Consul代理启动后,它并不知道其它节点的存在,它是一个孤立的 单节点集群,如果想感知到其它节点的存在,它必须加入到一个现存的集群,要加入到一个现存的集群,它只用加入集群中任意一个现存的成员,当加入一个现存的成员后,会通过成员间的通讯很快发现集群中的其它成员,一个Consul代理可以加入任意一个代理,而不仅仅是服务节点

参数
-advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
-bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-config-file:明确的指定要加载哪个配置文件
-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-dc:该标记控制agent允许的datacenter的名称,默认是dc1
-encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
-join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。
-retry-join:和join类似,但是允许你在第一次失败后进行尝试。
-retry-interval:两次join之间的时间间隔,默认是30s
-retry-max:尝试重复join的次数,默认是0,也就是无限次尝试
-log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-protocol:consul使用的协议版本
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
-syslog:开启系统日志功能,只在linux/osx上生效
-pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent

下载地址:
https://releases.hashicorp.com/consul/0.8.1/consul_0.8.1_linux_amd64.zip

安装:
#unzip consul_0.8.1_linux_amd64.zip
#mv consul /usr/local/bin


简单使用

[root@localhost ~]# nohup consul agent -server -bootstrap -data-dir /opt/consul -node=s221 -bind=10.1.13.221 & 
[root@localhost ~]# consul info
agent:
        check_monitors = 0
        check_ttls = 0
        checks = 0
        services = 1
build:
        prerelease = 
        revision = 'e9ca44d
        version = 0.8.1
consul:
        bootstrap = true
        known_datacenters = 1
        leader = true
        leader_addr = 10.1.13.221:8300
        server = true
raft:
        applied_index = 191
        commit_index = 191
        fsm_pending = 0
        last_contact = 0
        last_log_index = 191
        last_log_term = 4
        last_snapshot_index = 0
        last_snapshot_term = 0
        latest_configuration = [{Suffrage:Voter ID:10.1.13.221:8300 Address:10.1.13.221:8300}]
        latest_configuration_index = 1
        num_peers = 0
        protocol_version = 2
        protocol_version_max = 3
        protocol_version_min = 0
        snapshot_version_max = 1
        snapshot_version_min = 0
        state = Leader
        term = 4
runtime:
        arch = amd64
        cpu_count = 2
        goroutines = 63
        max_procs = 2
        os = linux
        version = go1.8.1
serf_lan:
        encrypted = false
        event_queue = 1
        event_time = 3
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 1
        members = 1
        query_queue = 0
        query_time = 1
serf_wan:
        encrypted = false
        event_queue = 0
        event_time = 1
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 1
        members = 1
        query_queue = 0
        query_time = 1


server2:10.1.13.222[client端]
[root@localhost ~]# nohup consul agent -data-dir /opt/consul -node=c222 -bind=10.1.13.222 &

这时查看状态,是没有加入到server端的
[root@localhost ~]# consul members
Node  Address           Status  Type    Build  Protocol  DC
c222  10.1.13.222:8301  alive   client  0.8.1  2         dc1

需要在server1:10.1.13.221服务端执行,join后边加客户端的ip
[root@localhost ~]# consul join 10.1.13.222

或者在client启动的时候加入
[root@localhost ~]# nohup consul agent -data-dir /opt/consul -node=c222 -join=10.1.13.221 -bind=10.1.13.222 &

再查看状态,服务端和客户端都一样
[root@localhost ~]# consul members
Node  Address           Status  Type    Build  Protocol  DC
c222  10.1.13.222:8301  alive   client  0.8.1  2         dc1
s221  10.1.13.221:8301  alive   server  0.8.1  2         dc1

DNS查看
[root@localhost ~]# dig @127.0.0.1 -p 8600 c222.node.consul
...
c222.node.consul.       0       IN      A       10.1.13.222
...


服务注册
服务注册有两种方式
·服务定义:是服务注册最常用的方法
·HTTP API:通过HTTP API方式注册

服务定义注册
服务定义
[root@localhost ~]# mkdir /etc/consul.d
[root@localhost ~]# echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' >/etc/consul.d/web.json
[root@localhost ~]# nohup consul agent -server -bootstrap-expect 1 -data-dir /opt/consul -config-dir /etc/consul.d -node=s221 -bind=10.1.13.221 &

查看定义的服务
方式1
[root@localhost ~]# dig @127.0.0.1 -p8600 web.service.consul
...
web.service.consul.     0       IN      A       10.1.13.221
...

方式2
[root@lcoalhost ~]# curl -s http://localhost:8500/v1/catalog/service/web | python -m json.tool
[
    {
        "Address": "10.1.13.221",
        "CreateIndex": 325,
        "ID": "cea73f23-8839-eef8-c932-2ab960e7e019",
        "ModifyIndex": 325,
        "Node": "s221",
        "NodeMeta": {},
        "ServiceAddress": "",
        "ServiceEnableTagOverride": false,
        "ServiceID": "web",
        "ServiceName": "web",
        "ServicePort": 80,
        "ServiceTags": [
            "rails"
        ],
        "TaggedAddresses": {
            "lan": "10.1.13.221",
            "wan": "10.1.13.221"
        }
    }
]

HTTP API方式注册

服务定义
[root@lcoalhost ~]# curl -X PUT http://127.0.0.1:8500/v1/agent/service/register -i -H "Content-Type:application/json" -H "Accept:application/json" -d '{"ID":"db","Name" :"db","Tags":["duxuefeng"],"Address":"10.1.13.221","Port":3306}'

查看定义的服务
[root@localhost ~]# curl -s http://localhost:8500/v1/catalog/service/db | python -m json.tool    
[
    {
        "Address": "10.1.13.221",
        "CreateIndex": 377,
        "ID": "cea73f23-8839-eef8-c932-2ab960e7e019",
        "ModifyIndex": 377,
        "Node": "s221",
        "NodeMeta": {},
        "ServiceAddress": "10.1.13.221",
        "ServiceEnableTagOverride": false,
        "ServiceID": "db",
        "ServiceName": "db",
        "ServicePort": 3306,
        "ServiceTags": [
            "duxuefeng"
        ],
        "TaggedAddresses": {
            "lan": "10.1.13.221",
            "wan": "10.1.13.221"
        }
    }
]

服务添加主机
如果在server1上注册一个服务
server1:10.1.13.221[server端]
[root@lcoaolhost ~]# curl -X PUT http://127.0.0.1:8500/v1/agent/service/register -i -H "Content-Type:application/json" -H "Accept:application/json" -d '{"ID":"nginx","Name" :"nginx","Tags":["duxuefeng"],"Address":"10.1.13.221","Port":80}'

需要在其他主机上(server2)添加自己到服务中,前提是这台主机已经加入到cluster中
server2:10.1.13.222[client端]
[root@localhost ~]# consul members
Node  Address           Status  Type    Build  Protocol  DC
c222  10.1.13.222:8301  alive   client  0.8.1  2         dc1
s221  10.1.13.221:8301  alive   server  0.8.1  2         dc1

[root@localhost ~]# curl -X PUT http://127.0.0.1:8500/v1/agent/service/register -i -H "Content-Type:application/json" -H "Accept:application/json" -d '{"ID":"nginx","Name" :"nginx","Tags":["duxuefeng"],"Address":"10.1.13.222","Port":80}'

查看
[root@localhost ~]# curl -s http://localhost:8500/v1/catalog/service/db | python -m json.tool   
[
    {
        "Address": "10.1.13.222",
        "CreateIndex": 506,
        "ID": "8b53f13a-f95b-b23a-db14-a4bc62e83bea",
        "ModifyIndex": 506,
        "Node": "c222",
        "NodeMeta": {},
        "ServiceAddress": "10.1.13.222",
        "ServiceEnableTagOverride": false,
        "ServiceID": "nginx",
        "ServiceName": "nginx",
        "ServicePort": 80,
        "ServiceTags": [
            "duxuefeng"
        ],
        "TaggedAddresses": {
            "lan": "10.1.13.222",
            "wan": "10.1.13.222"
        }
    },
    {
        "Address": "10.1.13.221",
        "CreateIndex": 377,
        "ID": "cea73f23-8839-eef8-c932-2ab960e7e019",
        "ModifyIndex": 503,
        "Node": "s221",
        "NodeMeta": {},
        "ServiceAddress": "10.1.13.221",
        "ServiceEnableTagOverride": false,
        "ServiceID": "nginx",
        "ServiceName": "nginx",
        "ServicePort": 80,
        "ServiceTags": [
            "duxuefeng"
        ],
        "TaggedAddresses": {
            "lan": "10.1.13.221",
            "wan": "10.1.13.221"
        }
    }
]

删除节点
在要删除的节点上退出consul cluster
server2:10.1.13.222[client端]
[root@localhost ~]# consul leave

[root@localhost ~]# curl -s http://localhost:8500/v1/catalog/service/db | python -m json.tool   
[
    {
        "Address": "10.1.13.221",
        "CreateIndex": 377,
        "ID": "cea73f23-8839-eef8-c932-2ab960e7e019",
        "ModifyIndex": 503,
        "Node": "s221",
        "NodeMeta": {},
        "ServiceAddress": "10.1.13.221",
        "ServiceEnableTagOverride": false,
        "ServiceID": "db",
        "ServiceName": "db",
        "ServicePort": 3306,
        "ServiceTags": [
            "duxuefeng"
        ],
        "TaggedAddresses": {
            "lan": "10.1.13.221",
            "wan": "10.1.13.221"
        }
    }
]


consul节点健康检查
在需要做健康检查的节点上,应放在所有节点上
[root@localhost ~]# echo '{"check": {"name": "ping", "script": "ping -c1 www.baidu.com >/dev/null", "interval": "30s"}}' >/etc/consul.d/ping.json
[root@localhost ~]# nohup consul agent -data-dir /opt/consul -node=c222 -join=10.1.13.221 -bind=10.1.13.222 -config-dir /etc/consul.d &

[root@localhost ~]# curl -s http://localhost:8500/v1/health/state/any | python -m json.tool 
[
    {
        "CheckID": "ping",
        "CreateIndex": 621,
        "ModifyIndex": 625,
        "Name": "ping",
        "Node": "c222",
        "Notes": "",
        "Output": "",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    },
    {
        "CheckID": "serfHealth",
        "CreateIndex": 622,
        "ModifyIndex": 622,
        "Name": "Serf Health Status",
        "Node": "c222",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    },
    {
        "CheckID": "ping",
        "CreateIndex": 600,
        "ModifyIndex": 603,
        "Name": "ping",
        "Node": "s221",
        "Notes": "",
        "Output": "",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    },
    {
        "CheckID": "serfHealth",
        "CreateIndex": 175,
        "ModifyIndex": 175,
        "Name": "Serf Health Status",
        "Node": "s221",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    }
]

测试

把本机的解析关掉
[root@localhost ~]# vi /etc/resolv.conf 
# Generated by NetworkManager
search 223.5.5.5
#nameserver 8.8.8.8
#nameserver 10.1.1.1

[root@localhost ~]# curl -s http://localhost:8500/v1/health/state/any | python -m json.tool 
[
    {
        "CheckID": "ping",
        "CreateIndex": 621,
        "ModifyIndex": 652,
        "Name": "ping",
        "Node": "c222",
        "Notes": "",
        "Output": "ping: www.baidu.com: \u672a\u77e5\u7684\u540d\u79f0\u6216\u670d\u52a1\n",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "critical"
    },
    {
        "CheckID": "serfHealth",
        "CreateIndex": 622,
        "ModifyIndex": 622,
        "Name": "Serf Health Status",
        "Node": "c222",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    },
    {
        "CheckID": "ping",
        "CreateIndex": 600,
        "ModifyIndex": 603,
        "Name": "ping",
        "Node": "s221",
        "Notes": "",
        "Output": "",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    },
    {
        "CheckID": "serfHealth",
        "CreateIndex": 175,
        "ModifyIndex": 175,
        "Name": "Serf Health Status",
        "Node": "s221",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "Status": "passing"
    }
]

服务检查
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80, "check": {"script": "curl localhost:80 >/dev/null 2>&1", "interval": "10s"}}}' >/etc/consul.d/web.json

[root@localhost ~]# nohup consul agent -data-dir /opt/consul -node=c222 -join=10.1.13.221 -bind=10.1.13.222 -config-dir /etc/consul.d &


K/V data


定义值
[root@localhost ~]# curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/web/key1
[root@localhost ~]# curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/web/key2?flags=42
[root@localhost ~]# curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/web/web/sub/key3
查看
[root@localhost ~]# curl -s http://127.0.0.1:8500/v1/kv/?recurse|python -m json.tool
[
    {
        "CreateIndex": 734,
        "Flags": 0,
        "Key": "web/key1",
        "LockIndex": 0,
        "ModifyIndex": 745,
        "Value": "dGVzdA=="
    },
    {
        "CreateIndex": 749,
        "Flags": 42,
        "Key": "web/key2",
        "LockIndex": 0,
        "ModifyIndex": 749,
        "Value": "dGVzdA=="
    },
    {
        "CreateIndex": 751,
        "Flags": 0,
        "Key": "web/web/sub/key3",
        "LockIndex": 0,
        "ModifyIndex": 751,
        "Value": "dGVzdA=="
    }
]

删除key
[root@localhost ~]# curl -s http://127.0.0.1:8500/v1/kv/web/key1|python -m json.tool

修改key
curl -X PUT -d 'newval' http://127.0.0.1:8500/v1/kv/web/key1?cas=734
curl -s http://127.0.0.1:8500/v1/kv/web/key1|python -m json.tool


web UI

[root@localhost ~]# wget https://releases.hashicorp.com/consul/0.8.1/consul_0.8.1_web_ui.zip
[root@localhost ~]# unzip consul_0.8.1_web_ui.zip
[root@localhost ~]# mv static consul-ui
[root@localhost ~]# mv  consul-ui /opt
[root@localhost ~]# nohup consul agent -server -bootstrap-expect 1 -data-dir /opt/consul -config-dir /etc/consul.d -node=s221 -bind=10.1.13.221 -ui-dir /opt/consul/consul-ui &

启动后访问http://ip:8500/ui

转载于:https://my.oschina.net/duxuefeng/blog/890918

相关文章:

Matlab与线性代数 -- 全1矩阵

打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

java 冒泡排序和快速排序 实现

面试的时候经常会遇到面试官让你直接手写排序算法,下面是冒泡排序和快速排序的实现。冒泡排序基本流程就是,自下而上比较相邻的两个元素进行比较,让大的元素往下面沉,较小的往上冒。按照排序规则进行比较,如果是跟排序…

Matlab与线性代数 -- 零矩阵

打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

全球15个顶级技术类博客

1) 生活骇客(Lifehacker) http://www.lifehacker.com 生活骇客(Lifehacker)的座右铭表达了它的全部理念:“不要为技术而生活,要为生活而关注技术!”这个博客提供了有关于各方各面的“时间节省”…

[ExtJS5学习笔记]第五节 使用fontawesome给你的extjs5应用添加字体图标

本文地址:http://blog.csdn.net/sushengmiyan/article/details/38458411本文作者:sushengmiyan-------------------------------------------------资源链接--------------------------------------------------------FontAwesome glyph编码:…

正则式高人谈解答正则式的心得

条件1: 长度为14个字符 条件2: 其中任意9个位置为数字,并且数字只能是(0,1,3) 条件3: 其余的位置全部为"-"符号 ------------------------------------------ 求一个正则表达式 答案为:^(?!(.*?-){6,})(?…

数据结构与算法--线性表(顺序表)

本图文主要掌握以下问题: 1. 什么是线性表,线性表有哪些操作? 2. 如何利用顺序结构实现线性表?

Myeclipse在启动tomcat的时候的模式改变

在Myeclipse中, windows->preferences->Myeclipse->Servers->Tomcat 然后找到你的相应的Tomcat服务器的版本 当选择Debug mode的时候,当启动tomcat的时候,会进入debug视图 当选择Run mode的时候,启动tomcat的时候&a…

Request.ServerVariables参数集

Request.ServerVariables("Url") 返回服务器地址 Request.ServerVariables("Path_Info") 客户端提供的路径信息 Request.ServerVariables("Appl_Physical_Path") 与应用程序元数据库路径相应的物理路径 Request.ServerVariables("Path_T…

Linux (x86) Exploit 开发系列教程之十一 Off-By-One 漏洞(基于堆)

Off-By-One 漏洞(基于堆) 译者:飞龙 原文:Off-By-One Vulnerability (Heap Based) 预备条件: Off-By-One 漏洞(基于栈)理解 glibc mallocVM 配置:Fedora 20(x86&#xff…

利用链式存储结构实现线性表

本图文主要介绍了如何利用链式存储结构实现线性表。

自己用的快捷键

win7中 1. Ctrl Shift N —— 创建一个新的文件夹你需要在文件夹窗口中按 Ctrl Shift N 才行,在 Chrome 中是打开隐身窗口的快捷键。2.Win 上/下/左/右 —— 移动当前激活窗口其中,Win 左/右 为移动窗口到屏幕两边,占半屏,Wi…

3月到9月之9月到12月

看看自己这个博客,偶然发现上次的到现在又是半年过去了,这中间发生的太多,可能我天生不爱写东西,呵半年留一次脚印,真不知道我的博客对于博客园来讲算不算资源浪费!常看别人的,但自己没写过&…

Java动态代理机制

在Java的动态代理机制中,有两个重要的类。一个是InvocationHandler,另一个是Proxy。InvocationHandler:每一个动态代理类都必须要实现InvocationHandler接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理…

Matlab与线性代数 -- 魔方矩阵

本图文主要介绍了如何利用Matlab实现魔方矩阵。

springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void。下面将对具体的一一进行说明: ModelAndView Java代码 RequestMapping("/show1") public ModelAndView show1(HttpServletRequest request, …

[文摘20070930]人际关系,你有五十五招

第1招 认清人生的意义以及毕生所全力以赴的目标 为什么要这么拼命?因为你必须对得起自己的良知。 想要成为一个人际关系高手,第一步就必须先确认你的价值观;若是你连这个都摸不清楚,就很难去看透人生的意义,更不用说…

数据库抽取,生成CSV文件导出,CSVUtils工具类

2019独角兽企业重金招聘Python工程师标准>>> 开发背景: 最近一直在忙一个任务调度系统,需求一直没定下来,需求一直变更,调度一直改,往往复复。。。 等这波忙完了可以写一下关于BI这边调度任务的相关问题&am…

Matlab与线性代数 -- Pascal矩阵

本文主要介绍利用Matlab实现pascal矩阵的相关知识。

java加密算法

java加密算法 本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。 BASE64编码算法不算是真正的加密算法。 MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基…

在多台FMS服务器之间共享流

FMS有一个非常重要的功能,那就是可以在多台服务器之间共享流. 利用这一功能,我们可以把源服务器上的流分发到其它的服务器,这些获得流的服务器同样可以作为新的源服务器使用.这个功能有点象FMS集群. 我们都知道,利用WMP插件可以获取网上的流媒体地址制作网络电视台,其实利用Fla…

linux实现nat转发和内部端口映射

路由机 eth0:114.114.114.114(公网ip) eth1:192.168.1.1(内网ip) pc1 eth0:192.168.1.2(内网ip) eth1(拨号ip) pc2 eth0:192.168.1.3(内网ip) eth1(拨号ip) 1.配置路由机网卡信息 vim /etc/sysconfig/network-scripts/ifcfg-eth1 TYPEEthernet BOOTPROTOstati…

15级团队学习成果汇报 -- 利用C#语言实现展览厅

本图文主要是15级团队学习成果的汇报“ 利用C#语言实现展览厅”。

我所理解的Spring AOP的基本概念

Spring AOP中的概念晦涩难懂,读官方文档更是像读天书,看了很多例子后,写一些自己理解的一些spring的概念。要理解面向切面编程,要首先理解代理模式和动态代理模式。 假设一个OA系统中的一个功能是查看考勤信息,那么我…

你需要的大概不是 enumerated

作者:KHANLOU,原文链接,原文日期:2017-03-28译者:四娘;校对:Cwift;定稿:CMBSwift 标准库里最容易被滥用的就是 Sequence 的 enumerated() 函数。这个函数会返回一个新的序…

Matlab与线性代数 -- 正态分布的随机矩阵

本图文介绍了如何利用Matlab实现正态分布的随机矩阵。

修改maven本地仓库的位置及疑惑

maven的默认仓库在~/.m2/repository下,这个是在c盘下,很多系统程序都在c盘,而且c盘的空间有时候不够大,所以经常要修改本地repository的位置,我做的修改如下: 在D盘建立一个repository:D:\mave…

值得FS去的英雄副本

1) 奥金尼地穴腰带 18耐23智19精 22法爆28法伤2) 塞泰克大厅法杖 40耐42智 37法爆168法伤3) 暗影迷宫腰带 31耐27智 17法爆34法伤4) 奴隶围栏饰品 37法伤一定几率使施法加速320,持续6秒5) 盘牙洞穴魔杖 10智 11法爆20法伤转载于:https://www.cnblogs.com/Evanescence/archive/2…

利用C#语言实现小闹钟

本图文主要是15级团队学习成果的汇报“ 利用C#语言实现小闹钟”。