<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>郑菲菲_fei</title>
  
  <subtitle>郑菲菲_fei</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.zhengyuyan.com/"/>
  <updated>2019-03-06T10:20:58.177Z</updated>
  <id>https://www.zhengyuyan.com/</id>
  
  <author>
    <name>郑玉燕</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>javascript</title>
    <link href="https://www.zhengyuyan.com/201903/04/javascript/"/>
    <id>https://www.zhengyuyan.com/201903/04/javascript/</id>
    <published>2019-03-04T12:13:02.000Z</published>
    <updated>2019-03-06T10:20:58.177Z</updated>
    
    <content type="html"><![CDATA[<h1 id="javascrip简介"><a href="#javascrip简介" class="headerlink" title="javascrip简介"></a>javascrip简介</h1><h2 id="javascript实现"><a href="#javascript实现" class="headerlink" title="javascript实现"></a>javascript实现</h2><ul><li>ecmascript<ul><li>语法</li><li>类型</li><li>语句</li><li>关键字</li><li>保留字</li><li>操作符</li><li>对象</li></ul></li><li>dom<ul><li>dom视图</li><li>dom事件</li><li>dom样式</li></ul></li><li>bom<ul><li>弹出浏览器</li><li>移动，缩放，关闭浏览器</li><li>navigator</li><li>location</li><li>screen</li><li>cookie</li><li>XMLHttpRequest(ActiveXObject)<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javascript_1.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></li></ul></li></ul><h2 id="script属性"><a href="#script属性" class="headerlink" title="script属性"></a>script属性</h2><ul><li>async 可选 表示立即下载脚本，不妨碍页面中其他操作，只对外部脚本文件有效</li><li>charset 可选</li><li>defer 可选 表示脚本可以延迟到文档完全被解析和显示之后再执行，只对外部脚本文件有效</li><li>language 已废弃</li><li>src 可选。表示包含要执行代码的外部文件</li><li>type 可选 </li></ul><h2 id="html文档模式"><a href="#html文档模式" class="headerlink" title="html文档模式"></a>html文档模式</h2><ul><li>混杂模式(quirks mode)</li><li>标准模式(standards mode)</li><li>准标准模 式(almost standards mode)<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment">&lt;!--标准模式--&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- HTML 4.01 严格型 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- XHTML 1.0 严格型 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE html PUBLIC</span></span><br><span class="line"><span class="meta">"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- HTML 5 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--准标准模式 而对于准标准模式，则可以通过使用过渡型(transitional)或框架集型(frameset)文档类型来触发--&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- HTML 4.01 过渡型 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE HTML PUBLIC</span></span><br><span class="line"><span class="meta">"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;</span></span><br><span class="line"></span><br><span class="line">   <span class="comment">&lt;!-- HTML 4.01 框架集型 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE HTML PUBLIC </span></span><br><span class="line"><span class="meta"> "-//W3C//DTD HTML 4.01 Frameset//EN"</span></span><br><span class="line"><span class="meta">"http://www.w3.org/TR/html4/frameset.dtd"&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- XHTML 1.0 过渡型 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE html PUBLIC</span></span><br><span class="line"><span class="meta">"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- XHTML 1.0 框架集型 --&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE html PUBLIC</span></span><br><span class="line"><span class="meta">"-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"&gt;</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="ecmascript"><a href="#ecmascript" class="headerlink" title="ecmascript"></a>ecmascript</h1><h2 id="严格模式"><a href="#严格模式" class="headerlink" title="严格模式"></a>严格模式</h2><p>在顶部或函数体首行<code>&quot;use strict&quot;;</code></p><h2 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h2><ul><li>number</li><li>string</li><li>null</li><li>undefined</li><li>boolean</li></ul><h3 id="typeof操作符"><a href="#typeof操作符" class="headerlink" title="typeof操作符"></a>typeof操作符</h3><ul><li>“undefined” 如果这个值未定义;</li><li>“boolean” 如果这个值是布尔值;</li><li>“string” 如果这个值是字符串</li><li>“number” 如果这个值是数值</li><li>“object” 如果这个值是对象或 null;</li><li>“function” 如果这个值是函数<br><em><code>null == undefined</code>为true</em></li></ul><h3 id="boolean"><a href="#boolean" class="headerlink" title="boolean"></a>boolean</h3><table><br>    <tr><br>        <td>数据类型</td><br>        <td>转换为true的值</td><br>        <td>转换为false的值</td><br>    </tr><br>    <tr><br>        <td>Boolean</td><br>        <td>true</td><br>        <td>false</td><br>    </tr><br>    <tr><br>        <td>String</td><br>        <td>任何非空字符串</td><br>        <td>“”(空字符串)</td><br>    </tr><br>    <tr><br>        <td>Number</td><br>        <td>任何非零数字值(包括无穷大)</td><br>        <td>0和NaN</td><br>    </tr><br>    <tr><br>        <td>Object</td><br>        <td>任何对象</td><br>        <td>null</td><br>    </tr><br>    <tr><br>        <td>Undefined</td><br>        <td>/</td><br>        <td>undefined</td><br>    </tr><br></table><h3 id="number"><a href="#number" class="headerlink" title="number"></a>number</h3><p><em>浮点数值的最高精度是 17 位小数,<code>a + b == 0.3</code>为false</em><br>NaN<br><em><code>NaN == NaN</code>为false</em></p><h4 id="数值转换"><a href="#数值转换" class="headerlink" title="数值转换"></a>数值转换</h4><ul><li>Number()<ul><li>如果是 Boolean 值，true 和 false 将分别被转换为 1 和 0。</li><li>如果是数字值，只是简单的传入和返回。</li><li>如果是 null 值，返回 0。</li><li>如果是 undefined，返回 NaN。</li><li>如果是对象，则调用对象的 valueOf()方法，如果转换的结果是 NaN，则调用对象的 toString()方法</li><li>如果是字符串，遵循下列规则:<ul><li>如果字符串中只包含数字,前导的零被忽略</li><li>如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整 数值;</li><li>如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整 数值;</li><li>如果字符串是空的(不包含任何字符)，则将其转换为 0</li><li>如果字符串中包含除上述格式之外的字符，则将其转换为 NaN。</li></ul></li></ul></li><li>parseInt()</li><li>parseFloat()</li></ul><h3 id="string"><a href="#string" class="headerlink" title="string"></a>string</h3><h4 id="转换为字符串"><a href="#转换为字符串" class="headerlink" title="转换为字符串"></a>转换为字符串</h4><ul><li>toString()<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> age = <span class="number">11</span>;</span><br><span class="line"><span class="keyword">var</span> ageAsString = age.toString(); <span class="comment">// 字符串"11" </span></span><br><span class="line"><span class="keyword">var</span> found = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">var</span> foundAsString = found.toString(); <span class="comment">// 字符串"true"</span></span><br></pre></td></tr></table></figure></li></ul><p><em>数值、布尔值、对象和字符串值(没错，每个字符串也都有一个 toString()方法，该方法返回字 符串的一个副本)都有 toString()方法。但 null 和 undefined 值没有这个方法。在调用数值的 toString()方法时，可 以传递一个参数,toString()可以输出以二进制、八进制、十六进制，</em></p><ul><li>String()<ul><li>如果值有 toString()方法，则调用该方法(没有参数)并返回相应的结果;</li><li>如果值是 null，则返回”null”;</li><li>如果值是 undefined，则返回”undefined”。</li></ul></li></ul><h3 id="object"><a href="#object" class="headerlink" title="object"></a>object</h3><p>Object 的每个实例都具有下列属性和方法</p><ul><li>constructor:保存着用于创建当前对象的函数。对于前面的例子而言，构造函数(constructor) 就是 Object()。</li><li>Prototype: 对该对象的对象原型的引用。对于所有的对象，它默认返回 Object 对象的一个实例</li><li>hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。其中，作为参数的属性名(propertyName)必须以字符串形式指定(例 如:o.hasOwnProperty(“name”))。</li><li>isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。</li><li>PropertyIsEnumerable(name): 判断给定的属性是否可以用 for…in 语句进行枚举。</li><li>toString()</li><li>valueOf()</li></ul><h4 id="instanceof操作符"><a href="#instanceof操作符" class="headerlink" title="instanceof操作符"></a>instanceof操作符</h4><p>instanceof 运算符与 typeof 运算符相似，用于识别正在处理的对象的类型</p><h4 id="in操作符"><a href="#in操作符" class="headerlink" title="in操作符"></a>in操作符</h4><p>用来判断某个属性属于某个对象</p><h2 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h2><h3 id="arguments对象属性"><a href="#arguments对象属性" class="headerlink" title="arguments对象属性"></a>arguments对象属性</h3><ul><li>length 返回函数形参实际长度</li><li>argument[index] 获取函数参数值</li><li>argument.callee 返回函数本身</li></ul><h3 id="Function属性和方法"><a href="#Function属性和方法" class="headerlink" title="Function属性和方法"></a>Function属性和方法</h3><ul><li>length 返回函数定义的形参个数</li></ul><h2 id="引用类型"><a href="#引用类型" class="headerlink" title="引用类型"></a>引用类型</h2><h3 id="Object"><a href="#Object" class="headerlink" title="Object"></a>Object</h3><p>属性</p><ul><li>Configurable 表示能否通过 delete 删除属性从而重新定义属性<ul><li>Object.defineProperty(obj,key,config)</li></ul></li><li>Enumerable 表示能否通过 for-in 循环返回属性。</li><li>Writable 表示能否修改属性的值</li><li>Value 包含这个属性的数据值</li><li>Get 在读取属性时调用的函数。默认值为 undefined</li><li>Set 在写入属性时调用的函数。默认值为 undefined</li><li>object.keys(obj)</li></ul><p>原型</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> book = &#123;</span><br><span class="line">    _year: <span class="number">2004</span>,</span><br><span class="line">edition: <span class="number">1</span> &#125;;</span><br><span class="line"><span class="built_in">Object</span>.defineProperty(book, <span class="string">"year"</span>, &#123;</span><br><span class="line">    get: <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">this</span>._year;</span><br><span class="line">    &#125;,</span><br><span class="line">    set: <span class="function"><span class="keyword">function</span>(<span class="params">newValue</span>)</span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (newValue &gt; <span class="number">2004</span>) &#123;</span><br><span class="line">            <span class="keyword">this</span>._year = newValue;</span><br><span class="line">            <span class="keyword">this</span>.edition += newValue - <span class="number">2004</span>;</span><br><span class="line">&#125; &#125;</span><br><span class="line">&#125;);</span><br><span class="line">book.year = <span class="number">2005</span>; alert(book.edition); <span class="comment">//2</span></span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javascript_2.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure>  <h3 id="Array"><a href="#Array" class="headerlink" title="Array"></a>Array</h3><p>常见方法属性：</p><ul><li>constructor</li><li>length</li><li>prototype</li><li>Array.isArray(arr) 检测是否是数组</li><li>indexOf(item) 返回下标</li><li>lastIndexOf()</li><li>every() 每一项为true 返回true</li><li>some() 一项为true 返回true</li><li>filter() 返回该函数会返回 true 的项组成的数组</li><li>map() 返回每次函数调用的结果组成的数组</li><li>forEach() 没有返回值</li><li>concat(arr1，arr2) 连接两个或多个数组</li><li>join(code) 将数组使用code拼接成字符串</li><li>pop() 删除并返回最后一个元素</li><li>push(item,…) 向数组末尾添加一个或多个新元素，返回数组长度</li><li>reverse() 将数组顺序颠倒</li><li>shift() 删除并返回数组第一个元素</li><li>unshift() 在数组最前面添加一个或多个元素，返回数组长度</li><li>sort() 对数组进行排序</li><li>slice() 切割返回的数组</li><li>splice(index,delete,item) index操作第几个，delete 删除个数，item为添加的元素</li></ul><h3 id="Date"><a href="#Date" class="headerlink" title="Date"></a>Date</h3><ul><li>“月/日/年”，如 6/13/2004;</li><li>“英文月名 日,年”，如 January 12,2004;</li><li>“英文星期几 英文月名 日 年 时:分:秒 时区”，如 Tue May 25 2004 00:00:00 GMT-0700。</li><li>ISO 8601 扩展格式 YYYY-MM-DDTHH:mm:ss.sssZ(例如 2004-05-25T00:00:00)。只有兼容ECMAScript 5 的实现支持这种格式。  </li></ul><p>常见属性和方法：</p><ul><li>Date.now()</li><li>toDateString()——以特定于实现的格式显示星期几、月、日和年;</li><li>toTimeString()——以特定于实现的格式显示时、分、秒和时区; 10  toLocaleDateString()——以特定于地区的格式显示星期几、月、日和年;</li><li>toLocaleTimeString()——以特定于实现的格式显示时、分、秒;</li><li>toUTCString()——以特定于实现的格式完整的 UTC 日期。</li></ul><h3 id="RegExp"><a href="#RegExp" class="headerlink" title="RegExp"></a>RegExp</h3><p>属性和方法</p><ul><li>global:布尔值，表示是否设置了 g 标志。</li><li>ignoreCase:布尔值，表示是否设置了 i 标志。</li><li>lastIndex:整数，表示开始搜索下一个匹配项的字符位置，从 0 算起。</li><li>multiline:布尔值，表示是否设置了 m 标志。</li><li>source:正则表达式的字符串表示，按照字面量形式而非传入构造函数中的字符串模式返回。</li><li>exec(string) 返回包含第一个匹配项信息的数组</li><li>test(string) 检查字符串是否与给出的正则表达式模式相匹配，如果是则返回 true，否则就返回 false。<ul><li>在非全局匹配模式下，则不存在这个问题</li><li>在全局匹配模式下 对于同一个正则对象重复调用就会出现下一次的匹配位置从上一次匹配结束的位置开始,解决方法重置lastIndex为0<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> reg = <span class="regexp">/^[\d]&#123;2&#125;$/g</span>;</span><br><span class="line"><span class="keyword">let</span> str = <span class="string">"12"</span>;</span><br><span class="line"><span class="built_in">console</span>.log(reg.test(str));     <span class="comment">//返回true</span></span><br><span class="line"><span class="keyword">let</span> = <span class="string">"123"</span>;</span><br><span class="line"><span class="built_in">console</span>.log(reg.test(str));     <span class="comment">//从数字3开始匹配，只有一个数字，故返回false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 重置lastIndex为0</span></span><br><span class="line"> <span class="keyword">let</span> reg = <span class="regexp">/^[\d]&#123;2&#125;$/g</span>;</span><br><span class="line"><span class="keyword">let</span> str = <span class="string">"12"</span>;</span><br><span class="line"><span class="built_in">console</span>.log(reg.test(str));     <span class="comment">//返回true</span></span><br><span class="line"><span class="keyword">let</span> = <span class="string">"123"</span>;</span><br><span class="line">reg.lastIndex = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">console</span>.log(reg.test(str));     <span class="comment">//返回true</span></span><br></pre></td></tr></table></figure></li></ul></li></ul><h2 id="String"><a href="#String" class="headerlink" title="String"></a>String</h2><p>属性和方法：</p><ul><li>charAt() 返回在指定位置的字符。</li><li>concat() 连接字符串。</li><li>indexOf() 检索字符串。</li><li>lastIndexOf() 从后向前搜索字符串。</li><li>match() 找到一个或多个正则表达式的匹配。</li><li>replace() 替换与正则表达式匹配的子串。</li><li>serach() 检索与正则表达式相匹配的值。</li><li>slice() 提取字符串的片断，并在新的字符串中返回被提取的部分。</li><li>split() 把字符串分割为字符串数组。</li><li>substring() 提取字符串中两个指定的索引号之间的字符。</li><li>substr() 从起始索引号提取字符串中指定数目的字符。</li><li>toLowerCase()</li><li>toUpperCase()</li><li>localeCompare() 用本地特定的顺序来比较两个字符串。</li></ul><h2 id="Global"><a href="#Global" class="headerlink" title="Global"></a>Global</h2><ul><li>encodeURI() 对URI编码</li><li>encodeURIComponent() 对URI编码</li><li>decodeURI() 解码</li><li>decodeURIComponent() 解码</li><li>eval()</li><li>window</li><li>Math<ul><li>Math.ceil() 向上取整</li><li>Math.floor() 向下取整</li><li>Math.round() 四舍五入</li><li>Math.random() 0~1<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="built_in">Math</span>.floor(<span class="built_in">Math</span>.random() * (max - min + <span class="number">1</span>) + min)</span><br></pre></td></tr></table></figure></li></ul></li></ul><h2 id="原型与原型链"><a href="#原型与原型链" class="headerlink" title="原型与原型链"></a>原型与原型链</h2><ul><li>prototype</li><li><strong>proto</strong></li><li>constructor</li></ul><h1 id="DOM"><a href="#DOM" class="headerlink" title="DOM"></a>DOM</h1><h2 id="Node"><a href="#Node" class="headerlink" title="Node"></a>Node</h2><p>节点: 构成HTML文档最基本的单元<br>常用节点分为四类：</p><ul><li>文档节点 整个HTML文档</li><li>元素节点 HTML文档中的HTML标签</li><li>属性节点 元素的属性</li><li>文本节点 HTML标签里的文本内容</li></ul><table><br>    <tr><br>        <td> </td><br>        <td>NodeName</td><br>        <td>NodeType</td><br>        <td>NodeValue</td><br>    </tr><br>    <tr><br>        <td>文档节点</td><br>        <td>#document</td><br>        <td>9</td><br>        <td>null</td><br>    </tr><br>    <tr><br>        <td>元素节点</td><br>        <td>标签名</td><br>        <td>1</td><br>        <td>null</td><br>    </tr><br>    <tr><br>        <td>属性节点</td><br>        <td>属性名</td><br>        <td>2</td><br>        <td>属性值</td><br>    </tr><br>    <tr><br>        <td>文本节点</td><br>        <td>#text</td><br>        <td>3</td><br>        <td>文本内容</td><br>    </tr><br>    <tr><br>        <td></td><br>        <td></td><br>        <td></td><br>        <td></td><br>    </tr><br></table><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javascript_3.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h3 id="node属性和方法"><a href="#node属性和方法" class="headerlink" title="node属性和方法"></a>node属性和方法</h3><ul><li>nodeName</li><li>nodetype</li><li>nodevalue</li><li>firstChild</li><li>lastChild</li><li>parentNode</li><li>childNodes</li><li>nextSibling</li><li>previousSibling</li><li>cloneNode()</li><li>appendChild()</li><li>insertBefore()</li><li>replaceChild()</li></ul><h2 id="element"><a href="#element" class="headerlink" title="element"></a>element</h2><p>继承Node </p><ul><li>className</li><li>innerHTML</li><li>getAttribute()</li><li>setAttribute()</li><li>attributes -&gt; 返回nodeMap</li><li>getAttributeNodes()</li><li>hasAttribute()</li></ul><h2 id="attri"><a href="#attri" class="headerlink" title="attri"></a>attri</h2><ul><li>isid</li><li>name</li><li>value</li></ul><h1 id="事件"><a href="#事件" class="headerlink" title="事件"></a>事件</h1><h2 id="事件冒泡"><a href="#事件冒泡" class="headerlink" title="事件冒泡"></a>事件冒泡</h2><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javascript_4.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h2 id="事件捕获"><a href="#事件捕获" class="headerlink" title="事件捕获"></a>事件捕获</h2><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javascript_5.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h2 id="Dom事件流"><a href="#Dom事件流" class="headerlink" title="Dom事件流"></a>Dom事件流</h2><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javascript_6.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><p>DOM0<br>btn.click()</p><p>DOM2<br>btn.addEventListener(event,function,boolean) true 捕获阶段 触发事件 false 冒泡阶段触发事件<br>btn.removeEventListener(event,function,boolean)  </p><p>btn.attachEvent(event,function  ie<br>btn.detcahEvent()  </p><p><img src="/img/javascriptback.png" alt=""></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;javascrip简介&quot;&gt;&lt;a href=&quot;#javascrip简介&quot; class=&quot;headerlink&quot; title=&quot;javascrip简介&quot;&gt;&lt;/a&gt;javascrip简介&lt;/h1&gt;&lt;h2 id=&quot;javascript实现&quot;&gt;&lt;a href=&quot;#javas
      
    
    </summary>
    
      <category term="前端" scheme="https://www.zhengyuyan.com/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
      <category term="javascript" scheme="https://www.zhengyuyan.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>mac-npm-exception.md</title>
    <link href="https://www.zhengyuyan.com/201902/27/mac-npm-exception-md/"/>
    <id>https://www.zhengyuyan.com/201902/27/mac-npm-exception-md/</id>
    <published>2019-02-27T12:08:25.000Z</published>
    <updated>2019-02-27T12:12:58.528Z</updated>
    
    <content type="html"><![CDATA[<h1 id="mac系统npm安装包时，报Error-EACCES-permission-denied-access"><a href="#mac系统npm安装包时，报Error-EACCES-permission-denied-access" class="headerlink" title="mac系统npm安装包时，报Error: EACCES: permission denied, access `"></a>mac系统npm安装包时，报Error: EACCES: permission denied, access `</h1><ul><li>使用节点版本管理器重新安装npm（推荐）</li><li>NPM_CONFIG_PREFIX=~/.npm-global</li></ul><p><a href="https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally" target="_blank" rel="noopener">参考文档</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;mac系统npm安装包时，报Error-EACCES-permission-denied-access&quot;&gt;&lt;a href=&quot;#mac系统npm安装包时，报Error-EACCES-permission-denied-access&quot; class=&quot;headerlin
      
    
    </summary>
    
      <category term="Trouble" scheme="https://www.zhengyuyan.com/categories/Trouble/"/>
    
    
      <category term="mac" scheme="https://www.zhengyuyan.com/tags/mac/"/>
    
  </entry>
  
  <entry>
    <title>javaweb</title>
    <link href="https://www.zhengyuyan.com/201902/11/javaweb/"/>
    <id>https://www.zhengyuyan.com/201902/11/javaweb/</id>
    <published>2019-02-11T11:18:58.000Z</published>
    <updated>2019-02-26T15:20:48.321Z</updated>
    
    <content type="html"><![CDATA[<h1 id="tomcat解压目录"><a href="#tomcat解压目录" class="headerlink" title="tomcat解压目录"></a>tomcat解压目录</h1><ul><li>bin:可执行文件(startup.bat shutdown.bat)</li><li>conf:配置文件(server.xml)</li><li>lib:Tomcat依赖的jar文件</li><li>log:日志文件(记录出错等信息)</li><li>temp:临时文件</li><li>webapps:可执行的项目(开发的项目，放入该目录)</li><li>work:存放由jsp翻译成的java，以及编译成的class文件</li></ul><h1 id="配置tomcat"><a href="#配置tomcat" class="headerlink" title="配置tomcat"></a>配置tomcat</h1><ul><li>tomcat依赖java,必须配置JAVA_HOME</li><li>配置CATALINA_HOME(tomcat根目录)</li><li>每个项目都有WEB-INF文件夹 (WEB_INF里有classes文件夹、lib文件夹、web.xml)</li><li>配置虚拟路径 Host标签添加Context标签 <code>&lt;Context docBase=&quot;&quot; path=“”&gt;</code> (docBase实际路径 path 虚拟路径 )</li><li>配置虚拟路径 也可在conf/Catalina/localhost 中新建”项目名.xml”中新增一行<code>&lt;Context docBase=&quot;&quot; path=“”&gt;</code></li><li>虚拟主机 <host></host></li></ul><h1 id="jsp执行流程"><a href="#jsp执行流程" class="headerlink" title="jsp执行流程"></a>jsp执行流程</h1><p>第一次<br>jsp -&gt; java -&gt; class(生成的java和class在work/Catalina/localhost(Host)/项目名/org/apcahe/jsp文件夹里)<br>第二次<br>直接访问class文件</p><h1 id="jsp页面元素"><a href="#jsp页面元素" class="headerlink" title="jsp页面元素"></a>jsp页面元素</h1><ul><li><p>脚本Scriptlet</p><figure class="highlight jsp"><table><tr><td class="code"><pre><span class="line">&lt;%   </span><br><span class="line"></span><br><span class="line">      局部变量java语句</span><br><span class="line"> %&gt;</span><br><span class="line"> </span><br><span class="line"> &lt;%!</span><br><span class="line">  全局变量 </span><br><span class="line"> </span><br><span class="line"> %&gt;</span><br><span class="line"> <span class="comment">//输出表达式</span></span><br><span class="line"> &lt;%=%&gt;</span><br></pre></td></tr></table></figure></li><li><p>注释</p></li><li><p>指令</p><ul><li>page 网页开头指定页面属性<ul><li>language</li><li>import 导入类</li><li>pageEncoding:jsp 文件自身编码</li><li>contentType:浏览器解析jsp编码 </li></ul></li><li>include</li><li>taglib</li></ul></li><li><p>jsp9大内置对象</p><ul><li>out: 向客户端输出</li><li>pageContext: </li><li>request：请求对象，存储客户端向服务端发送的请求信息<ul><li>String request.getParameter(string name) 获取请求参数</li><li>String[] request.getParameterValues(string name) 获取数组参数</li><li>void request.setCharacterencoding(string code) 设置编码</li><li>request.getServerletContext() 获取serverletcontext对象</li><li>request.getRequestDispatcher(“yemian”).forward(request,response) 请求转发</li><li>request.getcookies()</li></ul></li><li>response： 相应对象<ul><li>void response.addCookie(Cookie cookie) 服务端向客户端添加cookie</li><li>void sendRedirect(String location) 重定向 页面跳转 重定向 数据丢失</li><li>void setContenType(String type) 设置服务端相应编码</li></ul></li><li>session: 会话 开始-&gt;关闭 是一次会话，客户端第一次请求服务端时，服务端会产生一个session对象，用于保存信息，并且每个session对象，都会有一个唯一的sessionId(用于区分其他session)，服务端也会生成一个cookie,并且该cookie的name=JESSSIONID，value=服务端sessionId，然后 服务端会在 相应客户端的同事 将该cookie发送给客户端，至此，客户端就有了一个cookie(JSESSIONID),因此，客户端的cookie就可以和服务端的session一一对应</li><li>application: 全局对象<ul><li>application.getContextpath() 获取虚拟路径</li><li>application.getRealPath() 绝对路径（虚拟路径对应的绝对路径）</li></ul></li><li>config</li><li>page</li><li>exception</li></ul></li></ul><h1 id="JDBC"><a href="#JDBC" class="headerlink" title="JDBC"></a>JDBC</h1><p>JDBC API:提供各种操作访问接口 Connection Statement PrepareStatament ResultSet</p><ul><li>DriverManager:连接</li><li>Connection:连接</li><li>Statement(PrepareStatament): 增删改查</li><li>CallableStatement:调用函数或存储过程</li><li>Result:返回结果</li></ul><h2 id="数据库驱动"><a href="#数据库驱动" class="headerlink" title="数据库驱动"></a>数据库驱动</h2><ul><li>Oracle ojdbc-x.jar oracle.jdbc.OracleDriver</li><li>Mysql mysql-connector-java-x.jar com.mysql.jdbc.Driver</li><li>SqlServer sqljdbc-x.jar com.microsoft.sqlserver.jdbc.SQLServerDriver</li></ul><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 导入驱动类</span></span><br><span class="line">Class.forName(<span class="string">"驱动类"</span>);</span><br><span class="line"><span class="comment">// 与数据库建立连接</span></span><br><span class="line">Connectio connection = DriverManager.getConnectioin(url,user,password);</span><br><span class="line"><span class="comment">// 执行sql</span></span><br><span class="line">Statement stmt = connection.createStatement();</span><br><span class="line"><span class="keyword">int</span> i = stmt.executeUpdate(<span class="string">"sql"</span>);<span class="comment">//返回值标识 增 删改 几条数据</span></span><br><span class="line">ResultSet rst = stmt.executeQuery(<span class="string">"sql"</span>); <span class="comment">// 查询</span></span><br><span class="line">stmt.close();</span><br><span class="line">connection.close();</span><br></pre></td></tr></table></figure><h2 id="PrepareStatement操作"><a href="#PrepareStatement操作" class="headerlink" title="PrepareStatement操作"></a>PrepareStatement操作</h2><p>sql:”select * from xxx where id=?”<br>PrepareStatement.setString(1,”01”);<br>赋值操作setXXX(int index,XXX); 占位符</p><h2 id="PrepareStatement与Statement区别"><a href="#PrepareStatement与Statement区别" class="headerlink" title="PrepareStatement与Statement区别"></a>PrepareStatement与Statement区别</h2><h2 id="函数或存储过程"><a href="#函数或存储过程" class="headerlink" title="函数或存储过程"></a>函数或存储过程</h2><p>参数格式：</p><ul><li>存储过程  无返回值 有Out参数代替 {call 存储过程名（参数列表）}</li><li>存储函数 有返回值 {call 村塾函数名(参数列表)}<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 导入驱动类</span></span><br><span class="line">    Class.forName(<span class="string">"驱动类"</span>);</span><br><span class="line">    <span class="comment">// 与数据库建立连接</span></span><br><span class="line">    Connectio connection = DriverManager.getConnectioin(url,user,password);</span><br><span class="line">    CallableStatement csmt = connection.prepareCall(<span class="string">"&#123;call 存储过程名（参数列表）&#125;"</span>);</span><br><span class="line">    </span><br><span class="line">    csmt.execute()</span><br></pre></td></tr></table></figure></li></ul><h2 id="处理CLOB-text-BLOB类型"><a href="#处理CLOB-text-BLOB类型" class="headerlink" title="处理CLOB[text]/BLOB类型"></a>处理CLOB[text]/BLOB类型</h2><ul><li>CLOB: 大文本数据</li><li>BLOB: 二进制</li><li>存放路径</li></ul><h1 id="Serverlet"><a href="#Serverlet" class="headerlink" title="Serverlet"></a>Serverlet</h1><h2 id="serverlet2-5"><a href="#serverlet2-5" class="headerlink" title="serverlet2.5"></a>serverlet2.5</h2><ul><li>extend Httpservelet</li><li>@Overide doGet(HttpRequest request,HttpResponse response)</li><li>@Overide doPost(HttpRequest request,HttpResponse response)</li><li>配置web.xml <figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Serverlet</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">serverlet-name</span>&gt;</span>a<span class="tag">&lt;/<span class="name">serverlet-name</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">server-class</span>&gt;</span>com.xx.xxx<span class="tag">&lt;/<span class="name">serverlet-class</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Serverlet</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Serverlet-mapping</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">serverlet-name</span>&gt;</span>a<span class="tag">&lt;/<span class="name">serverlet-name</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">serverlet-url</span>&gt;</span>/xxx<span class="tag">&lt;/<span class="name">serverlet-url</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Serverlet-mapping</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul><h2 id="serverlet3-0"><a href="#serverlet3-0" class="headerlink" title="serverlet3.0"></a>serverlet3.0</h2><ul><li>extend Httpservelet</li><li>@Overide doGet(HttpRequest request,HttpResponse response)</li><li>@Overide doPost(HttpRequest request,HttpResponse response)</li><li>在类上添加注解@WebServerlet(value=”/xxxx”)</li></ul><h2 id="serverlet生命周期"><a href="#serverlet生命周期" class="headerlink" title="serverlet生命周期"></a>serverlet生命周期</h2><ul><li>加载（容器自动处理）</li><li>初始化 init() 只运行一次</li><li>服务（doget,dopost）</li><li>销毁 destory() 关闭容器时运行，只运行一次</li><li>卸载</li></ul><h2 id="getinitParameter-String-name"><a href="#getinitParameter-String-name" class="headerlink" title="getinitParameter(String name)"></a>getinitParameter(String name)</h2><ul><li><p>serverlet (super.getinitParameter(“xxxxx”))</p><ul><li>3.0 @WebServerlet(value=”xxx”,initParams={@WebInitParam()})</li><li>2.5<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Serverlet</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">serverlet-name</span>&gt;</span>a<span class="tag">&lt;/<span class="name">serverlet-name</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">server-class</span>&gt;</span>com.xx.xxx<span class="tag">&lt;/<span class="name">serverlet-class</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">init-param</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">param-name</span>&gt;</span>serverletparamname<span class="tag">&lt;/<span class="name">param-name</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">param-value</span>&gt;</span>value<span class="tag">&lt;/<span class="name">param-value</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">init-param</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Serverlet</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Serverlet-mapping</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">serverlet-name</span>&gt;</span>a<span class="tag">&lt;/<span class="name">serverlet-name</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">serverlet-url</span>&gt;</span>/xxx<span class="tag">&lt;/<span class="name">serverlet-url</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Serverlet-mapping</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul></li><li><p>容器的值 （super.getServerletContenttext().getinitParameter(name=”xxxx”,value=”xxxx”)）</p><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">context-param</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">param-name</span>&gt;</span>globalamname<span class="tag">&lt;/<span class="name">param-name</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">param-value</span>&gt;</span>globalvalue<span class="tag">&lt;/<span class="name">param-value</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">context-param</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="文件上传"><a href="#文件上传" class="headerlink" title="文件上传"></a>文件上传</h1><ul><li>commons-fifleupload.jar</li><li>commons-io.jar</li></ul><h1 id="El表达式"><a href="#El表达式" class="headerlink" title="El表达式"></a>El表达式</h1><p>EL存取变量数据的方法很简单，例如：${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username，所以它会依序从Page、Request、Session、Application范围查找。</p><ul><li>Page -&gt;  PageScope</li><li>Request -&gt;   RequestScope</li><li>Session   -&gt;  SessionScope</li><li>Application -&gt;  ApplicationScope</li></ul><h1 id="jstl"><a href="#jstl" class="headerlink" title="jstl"></a>jstl</h1><ul><li>引入两个jar包 jstl.jar,standard.jar</li><li>引入taglib &lt;%@ taglib uri=””,prefix=”c”%&gt;</li><li>通用标签库<ul><li>&lt;c:set var=””, value=””, scope=””&gt; 给某个变量赋值(scope:request,session,application) 相当于request.setAttribute()</li><li>&lt;c:out&gt;</li></ul></li><li>条件标签库<ul><li>&lt;c:if test=”” var=”result”&gt; result是结果 true false</li><li>&lt;c:choose&gt;&lt;c:when test=””&gt;&lt;/c:when&gt;&lt;c:otherwise&gt;&lt;/c:otherwise&gt;&lt;/c:choose&gt;</li></ul></li><li>迭代标签库<ul><li>&lt;c:forEach begin=”” end=”” step=”” varStatus=”status”&gt;${status.index}&lt;/c:forEach&gt;</li><li>&lt;c:forEach var=”students” items=”student”&gt;&lt;/c:forEach&gt;</li></ul></li></ul><h1 id="过滤器"><a href="#过滤器" class="headerlink" title="过滤器"></a>过滤器</h1><ul><li>implements Filter(javax.serverlet.Filter)</li><li>重写init(),doFilter(),destory() <figure class="highlight java"><table><tr><td class="code"><pre><span class="line">system.out.print(<span class="string">"请求拦截"</span>);</span><br><span class="line">chain.dofilter(request,response)</span><br><span class="line">system.out.print(<span class="string">"响应拦截"</span>);</span><br></pre></td></tr></table></figure></li></ul><ul><li>配置web.xml<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">filter</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">filter-name</span>&gt;</span>xxxx<span class="tag">&lt;/<span class="name">filter-name</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">filter-class</span>&gt;</span>XXX<span class="tag">&lt;/<span class="name">filter-class</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">filter</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">filter-mapping</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">filter-name</span>&gt;</span>xxxx<span class="tag">&lt;/<span class="name">filter-name</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url-pattern</span>&gt;</span>xxxx<span class="tag">&lt;/<span class="name">url-pattern</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">filter-mapping</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="监听器"><a href="#监听器" class="headerlink" title="监听器"></a>监听器</h1><ul><li>implements ServerletRequestListener,HttpSessionLister,SeverletContextListener</li><li>implements ServerletRequestAttributeListener, HttpSessionAttributeListener,SeverletContextAttributeListener 监听属性更改</li><li>重写(监听开始结束)</li><li>配置web.xml<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">listener</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">listener-class</span>&gt;</span>xxxxx<span class="tag">&lt;/<span class="name">listener-class</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">listener</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="脑图"><a href="#脑图" class="headerlink" title="脑图"></a>脑图</h1><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/javaweb.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;tomcat解压目录&quot;&gt;&lt;a href=&quot;#tomcat解压目录&quot; class=&quot;headerlink&quot; title=&quot;tomcat解压目录&quot;&gt;&lt;/a&gt;tomcat解压目录&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;bin:可执行文件(startup.bat shutdown.b
      
    
    </summary>
    
      <category term="java" scheme="https://www.zhengyuyan.com/categories/java/"/>
    
    
      <category term="javaweb" scheme="https://www.zhengyuyan.com/tags/javaweb/"/>
    
  </entry>
  
  <entry>
    <title>java修饰符</title>
    <link href="https://www.zhengyuyan.com/201812/27/java%E4%BF%AE%E9%A5%B0%E7%AC%A6/"/>
    <id>https://www.zhengyuyan.com/201812/27/java修饰符/</id>
    <published>2018-12-27T14:48:14.000Z</published>
    <updated>2018-12-27T15:22:28.104Z</updated>
    
    <content type="html"><![CDATA[<p>Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符：</p><ul><li>访问控制修饰符 : default, public , protected, private</li><li>非访问控制修饰符 : final, abstract, static, synchronized  </li></ul><h1 id="访问控制修饰符"><a href="#访问控制修饰符" class="headerlink" title="访问控制修饰符"></a>访问控制修饰符</h1><ul><li>default (即缺省，什么也不写）: 在同一包内可见，不使用任何修饰符。使用对象：类、接口、变量、方法。</li><li>private : 在同一类内可见。使用对象：变量、方法。 注意：不能修饰类（外部类）</li><li>public : 对所有类可见。使用对象：类、接口、变量、方法</li><li>protected : 对同一包内的类和所有子类可见。使用对象：变量、方法。 注意：不能修饰类（外部类）。</li></ul><table><br>    <tr><br>        <td>修饰符</td><br>        <td>当前类</td><br>        <td>同一包内</td><br>        <td>子孙包(同一包)</td><br>        <td>子孙包(不同包)</td><br>        <td>其他包</td><br>    </tr><br>    <tr><br>        <td>public</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>Y</td><br>    </tr><br>    <tr><br>        <td>protected</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>N</td><br>    </tr><br>    <tr><br>        <td>default</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>Y</td><br>        <td>N</td><br>        <td>N</td><br>    </tr><br>    <tr><br>        <td>private</td><br>        <td>Y</td><br>        <td>N</td><br>        <td>N</td><br>        <td>N</td><br>        <td>N</td><br>    </tr><br></table><h2 id="受保护的访问修饰符-protected"><a href="#受保护的访问修饰符-protected" class="headerlink" title="受保护的访问修饰符-protected"></a>受保护的访问修饰符-protected</h2><p>protected 需要从以下两个点来分析说明：</p><ul><li>子类与基类在同一包中：被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问；</li><li>子类与基类不在同一包中：那么在子类中，子类实例可以访问其从基类继承而来的 protected 方法，而不能访问基类实例的protected方法。</li></ul><h2 id="访问控制和继承"><a href="#访问控制和继承" class="headerlink" title="访问控制和继承"></a>访问控制和继承</h2><p>请注意以下方法继承的规则：</p><ul><li>父类中声明为 public 的方法在子类中也必须为 public。</li><li>父类中声明为 protected 的方法在子类中要么声明为 protected，要么声明为 public，不能声明为 private。</li><li>父类中声明为 private 的方法，不能够被继承。</li></ul><h2 id="非访问修饰符"><a href="#非访问修饰符" class="headerlink" title="非访问修饰符"></a>非访问修饰符</h2><p>为了实现一些其他的功能，Java 也提供了许多非访问修饰符。</p><ul><li>static 修饰符，用来修饰类方法和类变量。</li><li>final 修饰符，用来修饰类、方法和变量，final 修饰的类不能够被继承，修饰的方法不能被继承类重新定义，修饰的变量为常量，是不可修改的。</li><li>abstract 修饰符，用来创建抽象类和抽象方法。</li><li>synchronized 和 volatile 修饰符，主要用于线程的编程。</li></ul><h3 id="static-修饰符"><a href="#static-修饰符" class="headerlink" title="static 修饰符"></a>static 修饰符</h3><p>静态变量：<br>static 关键字用来声明独立于对象的静态变量，无论一个类实例化多少对象，它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。<br>静态方法：<br>static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据，然后计算这些数据。</p><h3 id="final-修饰符"><a href="#final-修饰符" class="headerlink" title="final 修饰符"></a>final 修饰符</h3><p>final 变量：<br>final 表示”最后的、最终的”含义，变量一旦赋值后，不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。<br>final 修饰符通常和 static 修饰符一起使用来创建类常量。<br>final 方法<br>类中的 final 方法可以被子类继承，但是不能被子类修改。<br>声明 final 方法的主要目的是防止该方法的内容被修改。</p><h3 id="synchronized-修饰符"><a href="#synchronized-修饰符" class="headerlink" title="synchronized 修饰符"></a>synchronized 修饰符</h3><p>synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。</p><h2 id="transient-修饰符"><a href="#transient-修饰符" class="headerlink" title="transient 修饰符"></a>transient 修饰符</h2><p>序列化的对象包含被 transient 修饰的实例变量时，java 虚拟机(JVM)跳过该特定的变量。<br>该修饰符包含在定义变量的语句中，用来预处理类和变量的数据类型。</p><h2 id="volatile-修饰符"><a href="#volatile-修饰符" class="headerlink" title="volatile 修饰符"></a>volatile 修饰符</h2><p>volatile 修饰的成员变量在每次被线程访问时，都强制从共享内存中重新读取该成员变量的值。而且，当成员变量发生变化时，会强制线程将变化值回写到共享内存。这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。<br>一个 volatile 对象引用可能是 null。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;访问控制修饰符 : default, public , protected, private&lt;/li&gt;
&lt;li&gt;非访问控制修饰符 : final, abstract, static, 
      
    
    </summary>
    
      <category term="java" scheme="https://www.zhengyuyan.com/categories/java/"/>
    
    
      <category term="java基础" scheme="https://www.zhengyuyan.com/tags/java%E5%9F%BA%E7%A1%80/"/>
    
  </entry>
  
  <entry>
    <title>java</title>
    <link href="https://www.zhengyuyan.com/201812/17/java/"/>
    <id>https://www.zhengyuyan.com/201812/17/java/</id>
    <published>2018-12-17T13:21:17.000Z</published>
    <updated>2018-12-27T15:42:18.821Z</updated>
    
    <content type="html"><![CDATA[<h1 id="classpath"><a href="#classpath" class="headerlink" title="classpath"></a>classpath</h1><p><code>java</code>中<code>classpath</code>配置的是<code>class</code>文件生成的地址，和运行<code>java</code>命令去找class文件的地址,一般不做配置</p><h1 id="java数据类型"><a href="#java数据类型" class="headerlink" title="java数据类型"></a>java数据类型</h1><p>基本类型：byte(1字节),short(2字节),int(4字节),long(8字节),float(4字节),double(8字节),char(2字节),boolean<br>引用类型：class,接口,数组,枚举等</p><h2 id="基本类型转换"><a href="#基本类型转换" class="headerlink" title="基本类型转换"></a>基本类型转换</h2><p>boolean不能转换为其他数据类型<br>默认转换<br>byte,short,char-&gt;int-&gt;long-&gt;float-&gt;double<br>byte,short,chart之间不转换,他们参与运算首先转换为int<br>在定义long或者float类型变量时，加L或者F(整数默认是int，浮点数默认是double)<br><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">byte</span> a = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">byte</span> b = <span class="number">4</span>;</span><br><span class="line"><span class="comment">// a+b结果为int</span></span><br><span class="line"><span class="comment">//byte c = a + b;</span></span><br><span class="line"><span class="keyword">byte</span> c = (<span class="keyword">byte</span>) (a+b);</span><br><span class="line"></span><br><span class="line"><span class="keyword">float</span> f = <span class="number">3.14F</span>;</span><br><span class="line"><span class="keyword">long</span> l = <span class="number">10000000L</span>;</span><br></pre></td></tr></table></figure></p><h1 id="方法重载"><a href="#方法重载" class="headerlink" title="方法重载"></a>方法重载</h1><p>在同一个类中，允许存在一个以上的同名方法，只要参数的个数或者参数类型不通即可。与返回值类型无关，只看方法名和参数列表</p><h1 id="数组"><a href="#数组" class="headerlink" title="数组"></a>数组</h1><p>数组初始化：数组必须初始化，然后才能使用，为数组的元素分配内存空间，并为每个数组元素赋值  </p><h2 id="数组初始化方式"><a href="#数组初始化方式" class="headerlink" title="数组初始化方式"></a>数组初始化方式</h2><ul><li>静态初始化：初始化只指定数组长度，由系统为数组分配初始值  <code>int[] a = new int[3]</code></li><li>动态初始化：初始化时指定每个数组元素的初始值，由系统决定长度 <code>int[] a = new int[]{1,2,3}</code><h2 id="数组常见错误"><a href="#数组常见错误" class="headerlink" title="数组常见错误"></a>数组常见错误</h2></li><li>不要同时进行静态和动态赋值</li><li>数组越界</li><li>空指针异常</li></ul><h1 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h1><p>可变参数<br><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//定义</span></span><br><span class="line">typeName... parameterName</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">VarargsDemo</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span> </span>&#123;</span><br><span class="line">        <span class="comment">// 调用可变参数的方法</span></span><br><span class="line">        printMax(<span class="number">34</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">56.5</span>);</span><br><span class="line">        printMax(<span class="keyword">new</span> <span class="keyword">double</span>[]&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">printMax</span><span class="params">( <span class="keyword">double</span>... numbers)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (numbers.length == <span class="number">0</span>) &#123;</span><br><span class="line">            System.out.println(<span class="string">"No argument passed"</span>);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">double</span> result = numbers[<span class="number">0</span>];</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;  numbers.length; i++)&#123;</span><br><span class="line">            <span class="keyword">if</span> (numbers[i] &gt;  result) &#123;</span><br><span class="line">                result = numbers[i];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        System.out.println(<span class="string">"The max value is "</span> + result);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h1 id="java内存分配"><a href="#java内存分配" class="headerlink" title="java内存分配"></a>java内存分配</h1><ul><li>栈 存放的是局部变量</li><li>堆 存放的是所有new出来的对象</li><li>方法区 (方法在栈里执行)</li><li>本地方法(系统相关)</li><li>寄存器(cpu)：不可控制</li></ul><h2 id="堆内存特点"><a href="#堆内存特点" class="headerlink" title="堆内存特点"></a>堆内存特点</h2><ul><li>每一个new出来的对象都有一个地址值</li><li>每个变量都有默认值<ul><li>byte,short,int,long都为0</li><li>float,double 为0.0</li><li>char 为’\u0000’</li><li>boolean 为false</li><li>引用类型为null</li></ul></li><li>使用完毕就变成垃圾，但并没有立即回收，会在垃圾回收器空闲时回收，这就是java占内存的原因</li></ul><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">int</span>[] a = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">3</span>];</span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/java_memory.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure>  <h2 id="栈内存特点"><a href="#栈内存特点" class="headerlink" title="栈内存特点"></a>栈内存特点</h2><ul><li>用完就释放</li><li>栈内存的两个引用指向同一个堆内存空间，无论操作哪个，都针对同一个地方</li></ul><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ArgDemo</span></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span></span>&#123;</span><br><span class="line">        <span class="keyword">int</span> a = <span class="number">10</span>;</span><br><span class="line">        <span class="keyword">int</span> b = <span class="number">20</span>;</span><br><span class="line">        change(a,b);</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">int</span>[] arr = <span class="keyword">new</span> <span class="keyword">int</span>[]&#123;<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>&#125;;</span><br><span class="line">        change(arr);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">change</span><span class="params">(<span class="keyword">int</span> a,<span class="keyword">int</span> b)</span></span>&#123;</span><br><span class="line">        a = b;</span><br><span class="line">        b = a + b;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span>[] arr)</span></span>&#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> x = <span class="number">0</span> ; x &lt; arr.length;x++)&#123;</span><br><span class="line">            <span class="keyword">if</span>(x%<span class="number">2</span>==<span class="number">0</span>)&#123;</span><br><span class="line">                arr[x] = arr[x] * <span class="number">2</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/meth_memory.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h1 id="java对象内存图"><a href="#java对象内存图" class="headerlink" title="java对象内存图"></a>java对象内存图</h1><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/object_memory.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h1 id="成员变量和局部变量"><a href="#成员变量和局部变量" class="headerlink" title="成员变量和局部变量"></a>成员变量和局部变量</h1><ul><li>成员变量在类中</li><li><p>局部变量在方法中定义或方法参数</p></li><li><p>成员变量在堆内存中</p></li><li><p>局部变量在栈内存中</p></li><li><p>成员变量随着对象的创建而创建，随着对象的消失而消失</p></li><li><p>局部变量随着方法的调用而存在，随着方法调用完毕而消失</p></li><li><p>有默认初始化值</p></li><li>没有默认初始化值，必须定义赋值后使用</li></ul><h1 id="访问修饰符"><a href="#访问修饰符" class="headerlink" title="访问修饰符"></a>访问修饰符</h1><h2 id="private"><a href="#private" class="headerlink" title="private"></a>private</h2><ul><li>权限修饰符</li><li>可以修饰成员(成员变量和成员方法)</li><li>被private修饰的成员只能在本类中才能访问</li></ul><h2 id="static"><a href="#static" class="headerlink" title="static"></a>static</h2><ul><li>可以修饰成员变量和成员方法</li><li>随着类的加载而加载</li><li>优先于对象存在</li><li>被类的所有对象共享</li><li>可以通过类名调用</li><li>静态方法中没有<code>this</code>关键字</li><li>静态方法只能访问静态成员变量和静态方法<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/static_memory.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></li></ul><h2 id="静态变量和成员变量"><a href="#静态变量和成员变量" class="headerlink" title="静态变量和成员变量"></a>静态变量和成员变量</h2><ul><li>静态变量属于类，所以也称类变量</li><li><p>成员变量属于对象，所以称为实例变量(对象变量)</p></li><li><p>静态变量存储于方法的静态区</p></li><li><p>成员变量存储于堆内存</p></li><li><p>成员变量随着对象的创建而创建，随着对象的消失而消失</p></li><li><p>静态变量随着类的加载而加载，随着类的消失而消失</p></li><li><p>静态变量可以通过对象调用，也可以通过类名调用</p></li><li>成员变量只能通过对象名调用</li></ul><h1 id="继承"><a href="#继承" class="headerlink" title="继承"></a>继承</h1><ul><li>低耦合 ：类与类之间的关系</li><li>高内聚 ：独立完成一件事情的能力</li><li>单继承</li><li>子类只能继承父类所有非私有的成员(成员方法和成员变量)</li><li>子类不能继承父类的构造方法，但是可以通过super关键字去访问父类构造方法</li></ul><ul><li>在子类方法的局部范围找，有就使用</li><li>在子类的成员范围找，有就使用</li><li>在父类的成员范围找，有就使用</li><li>如果找不到，报错</li></ul><h1 id="多态"><a href="#多态" class="headerlink" title="多态"></a>多态</h1><ul><li>某一个事物，在不同时刻表现出不同状态</li><li>多态<ul><li>继承</li><li>重写</li><li>父类引用指向子类引用</li></ul></li></ul><ul><li>成员变量 编译看左边，运行看左边</li><li>构造方法 创建子类对象时，访问父类构造方法，对父类的数据进行初始化</li><li>成员方法 编译看左边，运行看右边</li><li><p>静态方法 编译看左边，运行看左边</p></li><li><p>向上转型 Fu f = new Zi();</p></li><li>向下转型 Zi z = (Zi) f;</li></ul><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/duotai_mempry.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h1 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a>正则表达式</h1><ul><li>字符<ul><li>a 字符a</li><li>\ 反斜杠</li><li>\n 换行</li><li>\r 回车</li></ul></li><li>字符类<ul><li>[abc] a,b或c</li><li>[^abc] 任何字符 除了a,b,c</li><li>[a-zA-Z] a-z或A-Z</li><li>[0-9] 0到9</li></ul></li><li>预定义字符类<ul><li>. 任意字符</li><li>\d 数字:[0-9]</li><li>\w [a-zA-Z_0-9] 单词字符</li></ul></li><li>边界匹配器<ul><li>^ 行的开始</li><li>$ 行的结尾</li><li>\b 单词边界 不是单词字符的地方   </li></ul></li><li>数量词<ul><li>x? x,一次或一次也没有</li><li>x* x,零次或多次</li><li>x+ x,一次或多次</li><li>x{n} x,恰好n次</li><li>x{n,} x,至少n次</li><li>x{n,m} x,至少n次但不超过m次<h2 id="Pattern和Matcher"><a href="#Pattern和Matcher" class="headerlink" title="Pattern和Matcher"></a>Pattern和Matcher</h2>要先find() 然后group(捕获),不然报错IllgalstaeException</li></ul></li></ul><h1 id="获取任意范围随机数"><a href="#获取任意范围随机数" class="headerlink" title="获取任意范围随机数"></a>获取任意范围随机数</h1><p>(int) (Math.random() * (end - start + 1)) + start</p><h1 id="System"><a href="#System" class="headerlink" title="System"></a>System</h1><p>静态类  </p><h2 id="成员方法"><a href="#成员方法" class="headerlink" title="成员方法"></a>成员方法</h2><ul><li>public static void gc() 垃圾回收器 调用finalize();  不要频繁调用</li><li>public static void exit(int status) 终止当前运行的java虚拟机，非0表示异常终止</li><li>public static long currentTimeMillis()</li><li>public static arrarycopy()</li></ul><h1 id="常见数据结构"><a href="#常见数据结构" class="headerlink" title="常见数据结构"></a>常见数据结构</h1><ul><li>栈 先进后出 压栈 弹栈</li><li>队列 先进先出</li><li>数组</li><li>链表 数据和地址</li><li>树</li><li>哈希表</li></ul><h2 id="List的子类特点"><a href="#List的子类特点" class="headerlink" title="List的子类特点"></a>List的子类特点</h2><ul><li>ArrayList 底层数据结构是数组，查询快，增删慢，线程不安全，效率高</li><li>Vector 底层数据结构是数组，查询快，增删慢，线程安全，效率低</li><li>LinkedList 底层数据结构是链表，查询慢，增删快，线程不安全，效率高</li></ul><h1 id="泛型"><a href="#泛型" class="headerlink" title="泛型"></a>泛型</h1><ul><li>泛型类 public class 类名&lt;泛型类型1…&gt;  泛型类型必须是引用类型</li><li>泛型方法</li><li>泛型通配符<ul><li>泛型通配符&lt;?&gt; 任意类型</li><li>? extends E 向下限定，E及其子类</li><li>? super E 向上限定，E及其父类</li></ul></li></ul><h1 id="静态导入"><a href="#静态导入" class="headerlink" title="静态导入"></a>静态导入</h1><p>import static 包名….类名.方法名<br>方法必须是静态的<br>如果有多个同名的静态方法，必须加前缀</p><h1 id="IO"><a href="#IO" class="headerlink" title="IO"></a>IO</h1><h2 id="异常"><a href="#异常" class="headerlink" title="异常"></a>异常</h2><p>程序异常: Throwable<br>严重问题: Error<br>问题: Exception  (编译问题，运行问题(RuntimeException))  </p><p>一旦try里面出现了问题，就会抛出异常，然后和catch里的异常进行匹配，一旦匹配到了，就执行catch语句，然后结束了try…catch继续执行后面的语句</p><h2 id="throws"><a href="#throws" class="headerlink" title="throws"></a>throws</h2><p>使用定义方法时，需要把出现的问题暴露出来，让调用者去处理，那么通过throws在方法上标识，<br>方法抛出的是编译时异常必须要处理，如果抛出的是运行时异常可以不用处理</p><h2 id="throw"><a href="#throw" class="headerlink" title="throw"></a>throw</h2><p>在功能方法内部出现某种情况，程序不能继续运行，需要进行跳转，用异常把对象抛出</p><h2 id="finally"><a href="#finally" class="headerlink" title="finally"></a>finally</h2><p>finally语句块一定会被执行，catch里有return语句 会先执行finally语句块，然后执行return语句，用于释放资源</p><h2 id="自定义异常"><a href="#自定义异常" class="headerlink" title="自定义异常"></a>自定义异常</h2><ul><li>继承Exception</li><li>继承RuntimeException</li></ul><h2 id="流"><a href="#流" class="headerlink" title="流"></a>流</h2><h3 id="流向"><a href="#流向" class="headerlink" title="流向"></a>流向</h3><p>输入流(读)，输出流(写)</p><h3 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h3><p>字节流,字符流(操作文本)</p><ul><li>InputStream 字节输入流</li><li>OutputStream 字节输出流</li><li>Reader 字符输入流</li><li>Writer 字符输出流</li></ul><h2 id="序列化流"><a href="#序列化流" class="headerlink" title="序列化流"></a>序列化流</h2><ul><li>ObjectOutputStream  序列化 将对象按照流一样的方式存入文本文件或者网络中传输</li><li>ObjectInputStream 反序列化 将文本文件中的流对象或者网络中的流对象数据还原成对象<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//序列化</span></span><br><span class="line">ObjectOutputStream obs = <span class="keyword">new</span> ObjectInputStream(<span class="keyword">new</span> FileOutputStream(<span class="string">"d:\\a.txt"</span>));</span><br><span class="line">Person p = <span class="keyword">new</span> Person();</span><br><span class="line">obs.writeObject(p);</span><br><span class="line">obs.close();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//反序列化</span></span><br><span class="line">ObjectInputStream ois = <span class="keyword">new</span> ObjectInputStream(<span class="keyword">new</span> FileInputStream(<span class="string">"d:\\a.txt"</span>));</span><br><span class="line">Object o = ois.readObject();</span><br><span class="line">ois.close();</span><br></pre></td></tr></table></figure></li></ul><p>要实现序列化的对象须实现Serialible接口，<br>如果不想某个属性被序列化加上<code>transient</code><br>public static final long serialVersionUID = “-283289349237498723”; //随机生成  </p><h2 id="Properties"><a href="#Properties" class="headerlink" title="Properties"></a>Properties</h2><p>json<br>load<br>store</p><h1 id="多线程"><a href="#多线程" class="headerlink" title="多线程"></a>多线程</h1><p>如果程序只有一条执行路径是单线程，<br>如果有多条执行路径则是多线程  </p><h2 id="什么是进程"><a href="#什么是进程" class="headerlink" title="什么是进程"></a>什么是进程</h2><p>通过任务管理器，可以看到进程的存在；<br>只有运行的程序才有进程；<br>就是正在运行的程序，是系统进资源分配和调用的独立单位<br>每一个进程都有他自己的内存空间和系统资源 </p><h2 id="什么是线程"><a href="#什么是线程" class="headerlink" title="什么是线程"></a>什么是线程</h2><p>在同一个进程内可以执行多个任务，每个任务可以看成一个线程<br>线程是程序的执行单元  </p><ul><li>单线程：如果程序只有一条执行路径是单线程</li><li>多线程：如果有多条执行路径则是多线程  </li></ul><h2 id="Java运行原理"><a href="#Java运行原理" class="headerlink" title="Java运行原理"></a>Java运行原理</h2><p>java命令启动java虚拟机，启动jvm，等于启动了一个应用程序，该进程会自动启动一个“主线程“，然后“主线程“去调用某个类的main方法，所以main方法运行在主线程中  </p><h2 id="实现多线程"><a href="#实现多线程" class="headerlink" title="实现多线程"></a>实现多线程</h2><ul><li><p>extends Thread</p><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Mythread</span> <span class="keyword">extends</span> <span class="title">Thread</span></span>&#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="comment">// some code</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Test</span></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span></span>&#123;</span><br><span class="line">        <span class="comment">//</span></span><br><span class="line">        Mythread m1 = <span class="keyword">new</span> Mythread();</span><br><span class="line">        Mythread m2 = <span class="keyword">new</span> Mythread();</span><br><span class="line">        </span><br><span class="line">        m1.start();</span><br><span class="line">        m2.start();</span><br><span class="line">        </span><br><span class="line">        <span class="comment">//不能同一个线程对象调用两次start</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>实现Runnable</p></li></ul><h2 id="线程调度"><a href="#线程调度" class="headerlink" title="线程调度"></a>线程调度</h2><ul><li>分时调度 所有线程轮流使用CP的使用权，平均分配给每个线程占用CPU的时间片</li><li>抢占式调度 优先让优先级高的线程使用CPU</li></ul><p>线程默认优先级是5，优先级值为0-10</p><h2 id="线程控制"><a href="#线程控制" class="headerlink" title="线程控制"></a>线程控制</h2><ul><li>线程休眠 sleep(long millis)</li><li>线程加入 join() 为了某些线程执行完毕</li><li>线程礼让 yield()</li><li>后台线程 setDaemon(boolean on)</li><li>中断线程 stop() interrupt()</li></ul><h2 id="线程生命周期"><a href="#线程生命周期" class="headerlink" title="线程生命周期"></a>线程生命周期</h2><ul><li>新建 创建线程对象</li><li>就绪 有执行资格，没有执行权</li><li>运行 有执行资格，有执行权<ul><li>阻塞 由于一些操作，让线程处于该状态 没有执行资格，没有执行权，而另一些操作可以激活，激活后处于就绪状态</li></ul></li><li>死亡 线程对象变成垃圾，等待被回收</li></ul><h2 id="线程安全问题"><a href="#线程安全问题" class="headerlink" title="线程安全问题"></a>线程安全问题</h2><ul><li>多线程</li><li>有共享数据</li><li>多条语句操作共享数据</li></ul><h3 id="解决线程完全问题实现"><a href="#解决线程完全问题实现" class="headerlink" title="解决线程完全问题实现"></a>解决线程完全问题实现</h3><ul><li>同步代码块 synchronized 或者Lock<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">synchronized</span>(对象)&#123;</span><br><span class="line">    需要同步的代码块</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><h2 id="同步的特点"><a href="#同步的特点" class="headerlink" title="同步的特点"></a>同步的特点</h2><ul><li>多个线程</li><li>多个线程使用同一个锁对象</li></ul><h2 id="死锁"><a href="#死锁" class="headerlink" title="死锁"></a>死锁</h2><p>两个或两个以上的的线程在执行过程中因争夺资源产生的一种互相等待的情况<br>同步嵌套容易产生死锁问题</p><h2 id="等待唤醒"><a href="#等待唤醒" class="headerlink" title="等待唤醒"></a>等待唤醒</h2><ul><li>wait() 释放锁，notify() 在wait()处唤醒</li><li>notify()</li></ul><h2 id="线程转换图"><a href="#线程转换图" class="headerlink" title="线程转换图"></a>线程转换图</h2><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/thread_status.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><h2 id="线程组"><a href="#线程组" class="headerlink" title="线程组"></a>线程组</h2><h2 id="线程池"><a href="#线程池" class="headerlink" title="线程池"></a>线程池</h2><h1 id="设计模式"><a href="#设计模式" class="headerlink" title="设计模式"></a>设计模式</h1><p>面向对象设计原则</p><ul><li>单一职责 高内聚，低耦合</li><li>开闭原则 对扩展开放，对修改关闭</li><li>里氏替换原则  在任何父类出现过的地方都可以用子类代替</li><li>依赖注入原则 依赖于抽象，不要依赖于具体实现</li><li>接口分离原则</li><li>迪米特原则 一个对象对其他对象尽可能的少了解</li></ul><h2 id="设计模式分类"><a href="#设计模式分类" class="headerlink" title="设计模式分类"></a>设计模式分类</h2><ul><li>创建型模式<ul><li>简单工厂模式</li><li>工厂方法模式</li><li>抽象工厂模式</li><li>建造者模式</li><li>原型模式</li><li>单例模式</li></ul></li><li>结构型模式<ul><li>外观模式</li><li>适配模式</li><li>代理模式</li><li>装饰模式</li><li>桥接模式</li><li>组合模式</li><li>享元模式</li></ul></li><li>行为型模式<ul><li>模板方法模式</li><li>观察者模式</li><li>状态模式</li><li>职责链模式</li><li>命令模式</li><li>访问者模式</li><li>策略模式</li><li>备忘录模式</li><li>迭代器模式</li><li>解释器模式<h3 id="单例模式"><a href="#单例模式" class="headerlink" title="单例模式"></a>单例模式</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//饿汉</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Student</span></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="title">Student</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Student s = <span class="keyword">new</span> Student();</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="title">Student</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">return</span> s;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//懒汉,会产生线程安全问题，所以同步代码块</span></span><br><span class="line">publiic <span class="class"><span class="keyword">class</span> <span class="title">Teacher</span></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="title">Teacher</span><span class="params">()</span></span>&#123;&#125;</span><br><span class="line">    <span class="keyword">private</span> Teacher t = <span class="keyword">null</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">static</span> Teacher <span class="title">getTeacher</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(t == <span class="keyword">null</span>)&#123;</span><br><span class="line">            t = <span class="keyword">new</span> Teacher();   </span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> t;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul></li></ul><h1 id="GUI"><a href="#GUI" class="headerlink" title="GUI"></a>GUI</h1><h1 id="网络编程"><a href="#网络编程" class="headerlink" title="网络编程"></a>网络编程</h1><p>网络三要素</p><ul><li>IP地址</li><li>端口</li><li>协议<h2 id="IP地址分类"><a href="#IP地址分类" class="headerlink" title="IP地址分类"></a>IP地址分类</h2></li><li>A类 1.0.0.1~127.255.255.254  第一号段为网络号段 + 后三段的主机号段 一个网络号： 256<em>256</em>256</li><li>B类 128.0.0.1~191.255.255.255  前二号段为网络号段 + 后二段的主机号段 一个网络号： 256*256</li><li>C类 192.0.0.1~223.255.255。254 前三号段为网络号段 + 后一段的主机号段 一个网络号： 256</li><li>D类 224.0.0.1~39.55.255.254</li><li>E类 240.0.0.1~247.255.255.254</li></ul><h2 id="特殊的IP地址"><a href="#特殊的IP地址" class="headerlink" title="特殊的IP地址"></a>特殊的IP地址</h2><ul><li>127.0.0.1 回环地址</li><li>x.x.x.255 广播地址</li><li>x.x.x.0 网络地址</li></ul><h2 id="端口"><a href="#端口" class="headerlink" title="端口"></a>端口</h2><p>正在运行程序的标识<br>有效端口: 0~65535 其中0-1024系统进程端口</p><h2 id="协议"><a href="#协议" class="headerlink" title="协议"></a>协议</h2><ul><li>UDP 将数据源和目的封装成数据包，不需要建立连接，每个数据包的大小限制在64k；因无连接，不可靠协议，不需要建立连接，速度快</li><li>TCP 建立连接，形成传输数据的通道；在连接中进行大量数据传输，通过3次握手完成连接，是可靠协议；必须建立连接，效率低</li></ul><h2 id="Socket"><a href="#Socket" class="headerlink" title="Socket"></a>Socket</h2><p>Socket套接字：网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的符套接字  </p><h1 id="类加载器和反射"><a href="#类加载器和反射" class="headerlink" title="类加载器和反射"></a>类加载器和反射</h1><h2 id="类的加载"><a href="#类的加载" class="headerlink" title="类的加载"></a>类的加载</h2><p>当程序要使用某个类时如果该类还未加载到内存中，则系统会通过加载，连续，初始化三步来实现对这个类的初始化</p><ul><li>加载 <ul><li>就是将class文件读入内存中，并为之创建一个Class对象 </li><li>任何类被使用时系统都会创建一个class对象</li></ul></li><li>连续 <ul><li>验证 是否有正确的内部结构，并和其他类协调一致</li><li>准备 负责为类的静态成员分配内存，并设置默认初始化值</li><li>解析 将类的二进制数据中的符号引用替换为直接引用</li></ul></li><li>初始化</li></ul><h3 id="类加载器的组成"><a href="#类加载器的组成" class="headerlink" title="类加载器的组成"></a>类加载器的组成</h3><ul><li>BootStrap ClassLoader 跟类加载器  负责java核心类的加载 比如System,String等 jre/rt.jar</li><li>Extension ClassLoader 扩展类加载器 负责JRE的扩展目录中的jar包加载 JRE目录下lib目录下的ext目录</li><li>System ClassLoader 系统类加载器 负责JVM启动时加载来自java命令的class文件，以及classpath环境变量所指定的jar包和类路劲</li></ul><h2 id="反射"><a href="#反射" class="headerlink" title="反射"></a>反射</h2><p>java反射是在运行状态对于任意一个类，都能知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法和属性；这种动态的获取的信息以及调用对象的方法的功能称为反射机制。  </p><p>class类：  </p><ul><li>成员变量 Field</li><li>构造方法 Constructor</li><li>成员方法 Method</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;classpath&quot;&gt;&lt;a href=&quot;#classpath&quot; class=&quot;headerlink&quot; title=&quot;classpath&quot;&gt;&lt;/a&gt;classpath&lt;/h1&gt;&lt;p&gt;&lt;code&gt;java&lt;/code&gt;中&lt;code&gt;classpath&lt;/code&gt;配置
      
    
    </summary>
    
      <category term="java" scheme="https://www.zhengyuyan.com/categories/java/"/>
    
    
      <category term="java基础" scheme="https://www.zhengyuyan.com/tags/java%E5%9F%BA%E7%A1%80/"/>
    
  </entry>
  
  <entry>
    <title>hexohelp</title>
    <link href="https://www.zhengyuyan.com/201812/17/hexohelp/"/>
    <id>https://www.zhengyuyan.com/201812/17/hexohelp/</id>
    <published>2018-12-17T13:16:34.000Z</published>
    <updated>2018-12-17T13:21:04.945Z</updated>
    
    <content type="html"><![CDATA[<h1 id="hexo常用命令"><a href="#hexo常用命令" class="headerlink" title="hexo常用命令"></a>hexo常用命令</h1><h2 id="init"><a href="#init" class="headerlink" title="init"></a>init</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo init [folder]</span><br></pre></td></tr></table></figure><p>新建一个网站。如果没有设置 <code>folder</code> ，Hexo 默认在目前的文件夹建立网站。</p><h2 id="new"><a href="#new" class="headerlink" title="new"></a>new</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo new [layout] &lt;title&gt;</span><br></pre></td></tr></table></figure><p>新建一篇文章。如果没有设置 <code>layout</code> 的话，默认使用 <a href="configuration.html">_config.yml</a> 中的 <code>default_layout</code> 参数代替。如果标题包含空格的话，请使用引号括起来。</p><h2 id="generate"><a href="#generate" class="headerlink" title="generate"></a>generate</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>生成静态文件。</p><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>-d</code>, <code>--deploy</code></td><td>文件生成后立即部署网站</td></tr><tr><td><code>-w</code>, <code>--watch</code></td><td>监视文件变动</td></tr></tbody></table><p>该命令可以简写为<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo g</span><br></pre></td></tr></table></figure></p><h2 id="publish"><a href="#publish" class="headerlink" title="publish"></a>publish</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo publish [layout] &lt;filename&gt;</span><br></pre></td></tr></table></figure><p>发表草稿。</p><h2 id="server"><a href="#server" class="headerlink" title="server"></a>server</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>启动服务器。默认情况下，访问网址为： <code>http://localhost:4000/</code>。</p><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td><code>-p</code>, <code>--port</code></td><td>重设端口</td></tr><tr><td><code>-s</code>, <code>--static</code></td><td>只使用静态文件</td></tr><tr><td><code>-l</code>, <code>--log</code></td><td>启动日记记录，使用覆盖记录格式</td></tr></tbody></table><h2 id="deploy"><a href="#deploy" class="headerlink" title="deploy"></a>deploy</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>部署网站。</p><table><thead><tr><th>参数</th><th>描述</th></tr></thead><tbody><tr><td><code>-g</code>, <code>--generate</code></td><td>部署之前预先生成静态文件</td></tr></tbody></table><p>该命令可以简写为：<br><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo d</span><br></pre></td></tr></table></figure></p><h2 id="render"><a href="#render" class="headerlink" title="render"></a>render</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo render &lt;file1&gt; [file2] ...</span><br></pre></td></tr></table></figure><p>渲染文件。</p><table><thead><tr><th>参数</th><th>描述</th></tr></thead><tbody><tr><td><code>-o</code>, <code>--output</code></td><td>设置输出路径</td></tr></tbody></table><h2 id="migrate"><a href="#migrate" class="headerlink" title="migrate"></a>migrate</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo migrate &lt;<span class="built_in">type</span>&gt;</span><br></pre></td></tr></table></figure><p>从其他博客系统 <a href="migration.html">迁移内容</a>。</p><h2 id="clean"><a href="#clean" class="headerlink" title="clean"></a>clean</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo clean</span><br></pre></td></tr></table></figure><p>清除缓存文件 (<code>db.json</code>) 和已生成的静态文件 (<code>public</code>)。</p><p>在某些情况（尤其是更换主题后），如果发现您对站点的更改无论如何也不生效，您可能需要运行该命令。</p><h2 id="list"><a href="#list" class="headerlink" title="list"></a>list</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo list &lt;<span class="built_in">type</span>&gt;</span><br></pre></td></tr></table></figure><p>列出网站资料。</p><h2 id="version"><a href="#version" class="headerlink" title="version"></a>version</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo version</span><br></pre></td></tr></table></figure><p>显示 Hexo 版本。</p><h2 id="选项"><a href="#选项" class="headerlink" title="选项"></a>选项</h2><h3 id="安全模式"><a href="#安全模式" class="headerlink" title="安全模式"></a>安全模式</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo --safe</span><br></pre></td></tr></table></figure><p>在安全模式下，不会载入插件和脚本。当您在安装新插件遭遇问题时，可以尝试以安全模式重新执行。</p><h3 id="调试模式"><a href="#调试模式" class="headerlink" title="调试模式"></a>调试模式</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo --debug</span><br></pre></td></tr></table></figure><p>在终端中显示调试信息并记录到 <code>debug.log</code>。当您碰到问题时，可以尝试用调试模式重新执行一次，并 <a href="https://github.com/hexojs/hexo/issues/new" target="_blank" rel="noopener">提交调试信息到 GitHub</a>。</p><h3 id="简洁模式"><a href="#简洁模式" class="headerlink" title="简洁模式"></a>简洁模式</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo --silent</span><br></pre></td></tr></table></figure><p>隐藏终端信息。</p><h3 id="自定义配置文件的路径"><a href="#自定义配置文件的路径" class="headerlink" title="自定义配置文件的路径"></a>自定义配置文件的路径</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo --config custom.yml</span><br></pre></td></tr></table></figure><p>自定义配置文件的路径，执行后将不再使用 <code>_config.yml</code>。</p><h3 id="显示草稿"><a href="#显示草稿" class="headerlink" title="显示草稿"></a>显示草稿</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo --draft</span><br></pre></td></tr></table></figure><p>显示 <code>source/_drafts</code> 文件夹中的草稿文章。</p><h3 id="自定义-CWD"><a href="#自定义-CWD" class="headerlink" title="自定义 CWD"></a>自定义 CWD</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo --cwd /path/to/cwd</span><br></pre></td></tr></table></figure><p>自定义当前工作目录（Current working directory）的路径。</p><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://hexo.io/zh-cn/docs/commands" target="_blank" rel="noopener">hexo常用指令</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;hexo常用命令&quot;&gt;&lt;a href=&quot;#hexo常用命令&quot; class=&quot;headerlink&quot; title=&quot;hexo常用命令&quot;&gt;&lt;/a&gt;hexo常用命令&lt;/h1&gt;&lt;h2 id=&quot;init&quot;&gt;&lt;a href=&quot;#init&quot; class=&quot;headerlink&quot; 
      
    
    </summary>
    
      <category term="others" scheme="https://www.zhengyuyan.com/categories/others/"/>
    
    
      <category term="hexo" scheme="https://www.zhengyuyan.com/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>mac-Trouble</title>
    <link href="https://www.zhengyuyan.com/201811/13/mac-homebrew/"/>
    <id>https://www.zhengyuyan.com/201811/13/mac-homebrew/</id>
    <published>2018-11-13T15:41:50.000Z</published>
    <updated>2018-11-13T16:02:50.265Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Mac安装homebrew失败"><a href="#Mac安装homebrew失败" class="headerlink" title="Mac安装homebrew失败"></a>Mac安装homebrew失败</h1><ul><li>执行命令<code>ruby -version</code>,查看ruby版本</li><li><p>执行命令<code>ruby -e &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&quot;</code>后报错，报错信息如下</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Cloning into &apos;/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core&apos;...</span><br><span class="line">fatal: unable to access &apos;https://github.com/Homebrew/homebrew-core/&apos;: LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54</span><br><span class="line">Error: Failure while executing; `git clone https://github.com/Homebrew/homebrew-core /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1` exited with 128.</span><br><span class="line">Error: Failure while executing; `/usr/local/bin/brew tap homebrew/core` exited with 1.</span><br></pre></td></tr></table></figure></li><li><p>解决,执行一下命令</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1</span><br><span class="line">ruby -e &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&quot;</span><br></pre></td></tr></table></figure></li><li><p>等待安装即可</p></li></ul><h1 id="Mac安装mysql之后用navicat链接报错"><a href="#Mac安装mysql之后用navicat链接报错" class="headerlink" title="Mac安装mysql之后用navicat链接报错"></a>Mac安装mysql之后用navicat链接报错</h1><p>报错信息为：<br><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Authentication plugin &apos;caching_sha2_password&apos; cannot be </span><br><span class="line">loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_</span><br><span class="line">password.so, 2): image not found</span><br></pre></td></tr></table></figure></p><p>解决</p><ul><li>打开系统偏好设置，找到mysql，点击Initialize Database。</li><li>输入你的新密码。</li><li>选择‘Use legacy password‘。</li><li>重启mysql服务。</li><li>可以使用Navicat链接。 </li></ul><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://www.jianshu.com/p/9118ee9da3b7" target="_blank" rel="noopener">macOS安装homebrew报错 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54</a><br><a href="https://blog.csdn.net/java_yes/article/details/80104803#commentsedit" target="_blank" rel="noopener">Mysql 8.0.11版本，安装成功，使用Navicat连接失败</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Mac安装homebrew失败&quot;&gt;&lt;a href=&quot;#Mac安装homebrew失败&quot; class=&quot;headerlink&quot; title=&quot;Mac安装homebrew失败&quot;&gt;&lt;/a&gt;Mac安装homebrew失败&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;执行命令&lt;code&gt;ru
      
    
    </summary>
    
      <category term="Trouble" scheme="https://www.zhengyuyan.com/categories/Trouble/"/>
    
    
      <category term="mac" scheme="https://www.zhengyuyan.com/tags/mac/"/>
    
  </entry>
  
  <entry>
    <title>gradle-repositry</title>
    <link href="https://www.zhengyuyan.com/201811/13/gradle-repositry/"/>
    <id>https://www.zhengyuyan.com/201811/13/gradle-repositry/</id>
    <published>2018-11-13T15:36:29.000Z</published>
    <updated>2018-11-13T15:58:03.102Z</updated>
    
    <content type="html"><![CDATA[<h1 id="idea使用gradle下载依赖包时，速度过慢-仓库地址可以使用如下地址"><a href="#idea使用gradle下载依赖包时，速度过慢-仓库地址可以使用如下地址" class="headerlink" title="idea使用gradle下载依赖包时，速度过慢,仓库地址可以使用如下地址"></a>idea使用gradle下载依赖包时，速度过慢,仓库地址可以使用如下地址</h1><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">buildscript &#123;</span><br><span class="line">    repositories &#123;</span><br><span class="line">        maven &#123; url &apos;https://maven.aliyun.com/repository/central&apos; &#125;</span><br><span class="line">        maven&#123; url &apos;https://maven.aliyun.com/repository/jcenter&apos;&#125;</span><br><span class="line">        maven&#123;//配置Maven仓库的地址</span><br><span class="line">            url &quot;http://repo.springsource.org/libs-milestone-local&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">`</span><br></pre></td></tr></table></figure><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://blog.csdn.net/VcStrong/article/details/82807411" target="_blank" rel="noopener">gradle公共仓库解决下载jar包太慢</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;idea使用gradle下载依赖包时，速度过慢-仓库地址可以使用如下地址&quot;&gt;&lt;a href=&quot;#idea使用gradle下载依赖包时，速度过慢-仓库地址可以使用如下地址&quot; class=&quot;headerlink&quot; title=&quot;idea使用gradle下载依赖包时，速
      
    
    </summary>
    
      <category term="Trouble" scheme="https://www.zhengyuyan.com/categories/Trouble/"/>
    
    
      <category term="idea" scheme="https://www.zhengyuyan.com/tags/idea/"/>
    
      <category term="gradle" scheme="https://www.zhengyuyan.com/tags/gradle/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://www.zhengyuyan.com/201811/13/hello-world/"/>
    <id>https://www.zhengyuyan.com/201811/13/hello-world/</id>
    <published>2018-11-13T15:16:12.123Z</published>
    <updated>2018-11-13T15:16:12.123Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>istio metrics(六)</title>
    <link href="https://www.zhengyuyan.com/201807/17/istio-metrics/"/>
    <id>https://www.zhengyuyan.com/201807/17/istio-metrics/</id>
    <published>2018-07-17T13:54:48.000Z</published>
    <updated>2018-11-13T15:19:59.144Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Istio-Metrics"><a href="#Istio-Metrics" class="headerlink" title="Istio Metrics"></a>Istio Metrics</h1><h1 id="Service-Telemetry"><a href="#Service-Telemetry" class="headerlink" title="Service Telemetry"></a>Service Telemetry</h1><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Configuration for metric instances</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">metric</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">doublerequestcount</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  value:</span> <span class="string">"2"</span> <span class="comment"># count each request twice</span></span><br><span class="line"><span class="attr">  dimensions:</span></span><br><span class="line"><span class="attr">    source:</span> <span class="string">source.service</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    destination:</span> <span class="string">destination.service</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    message:</span> <span class="string">'"twice the fun!"'</span></span><br><span class="line"><span class="attr">  monitored_resource_type:</span> <span class="string">'"UNSPECIFIED"'</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Configuration for a Prometheus handler</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">prometheus</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">doublehandler</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  metrics:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">double_request_count</span> <span class="comment"># Prometheus metric name</span></span><br><span class="line"><span class="attr">    instance_name:</span> <span class="string">doublerequestcount.metric.istio-system</span> <span class="comment"># Mixer instance name (fully-qualified)</span></span><br><span class="line"><span class="attr">    kind:</span> <span class="string">COUNTER</span></span><br><span class="line"><span class="attr">    label_names:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">source</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">destination</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">message</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Rule to send metric instances to a Prometheus handler</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">rule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">doubleprom</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  actions:</span></span><br><span class="line"><span class="attr">  - handler:</span> <span class="string">doublehandler.prometheus</span></span><br><span class="line"><span class="attr">    instances:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">doublerequestcount.metric</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Configuration for logentry instances</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">logentry</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">newlog</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  severity:</span> <span class="string">'"warning"'</span></span><br><span class="line"><span class="attr">  timestamp:</span> <span class="string">request.time</span></span><br><span class="line"><span class="attr">  variables:</span></span><br><span class="line"><span class="attr">    source:</span> <span class="string">source.labels["app"]</span> <span class="string">| source.service | "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    user:</span> <span class="string">source.user</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    destination:</span> <span class="string">destination.labels["app"]</span> <span class="string">| destination.service | "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    responseCode:</span> <span class="string">response.code</span> <span class="string">| 0</span></span><br><span class="line"><span class="string"></span><span class="attr">    responseSize:</span> <span class="string">response.size</span> <span class="string">| 0</span></span><br><span class="line"><span class="string"></span><span class="attr">    latency:</span> <span class="string">response.duration</span> <span class="string">| "0ms"</span></span><br><span class="line"><span class="string"></span><span class="attr">  monitored_resource_type:</span> <span class="string">'"UNSPECIFIED"'</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Configuration for a stdio handler</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">stdio</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">newhandler</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr"> severity_levels:</span></span><br><span class="line"><span class="attr">   warning:</span> <span class="number">1</span> <span class="comment"># Params.Level.WARNING</span></span><br><span class="line"><span class="attr"> outputAsJson:</span> <span class="literal">true</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Rule to send logentry instances to a stdio handler</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">rule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">newlogstdio</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  match:</span> <span class="string">"true"</span> <span class="comment"># match for all requests</span></span><br><span class="line"><span class="attr">  actions:</span></span><br><span class="line"><span class="attr">   - handler:</span> <span class="string">newhandler.stdio</span></span><br><span class="line"><span class="attr">     instances:</span></span><br><span class="line"><span class="bullet">     -</span> <span class="string">newlog.logentry</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><h1 id="TCP-Telemetry"><a href="#TCP-Telemetry" class="headerlink" title="TCP Telemetry"></a>TCP Telemetry</h1><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Configuration for a metric measuring bytes sent from a server</span></span><br><span class="line"><span class="comment"># to a client</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">metric</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">mongosentbytes</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  value:</span> <span class="string">connection.sent.bytes</span> <span class="string">| 0 # uses a TCP-specific attribute</span></span><br><span class="line"><span class="string"></span><span class="attr">  dimensions:</span></span><br><span class="line"><span class="attr">    source_service:</span> <span class="string">source.service</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    source_version:</span> <span class="string">source.labels["version"]</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    destination_version:</span> <span class="string">destination.labels["version"]</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">  monitoredResourceType:</span> <span class="string">'"UNSPECIFIED"'</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Configuration for a metric measuring bytes sent from a client</span></span><br><span class="line"><span class="comment"># to a server</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">metric</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">mongoreceivedbytes</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  value:</span> <span class="string">connection.received.bytes</span> <span class="string">| 0 # uses a TCP-specific attribute</span></span><br><span class="line"><span class="string"></span><span class="attr">  dimensions:</span></span><br><span class="line"><span class="attr">    source_service:</span> <span class="string">source.service</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    source_version:</span> <span class="string">source.labels["version"]</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    destination_version:</span> <span class="string">destination.labels["version"]</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">  monitoredResourceType:</span> <span class="string">'"UNSPECIFIED"'</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Configuration for a Prometheus handler</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">prometheus</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">mongohandler</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  metrics:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">mongo_sent_bytes</span> <span class="comment"># Prometheus metric name</span></span><br><span class="line"><span class="attr">    instance_name:</span> <span class="string">mongosentbytes.metric.default</span> <span class="comment"># Mixer instance name (fully-qualified)</span></span><br><span class="line"><span class="attr">    kind:</span> <span class="string">COUNTER</span></span><br><span class="line"><span class="attr">    label_names:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">source_service</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">source_version</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">destination_version</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">mongo_received_bytes</span> <span class="comment"># Prometheus metric name</span></span><br><span class="line"><span class="attr">    instance_name:</span> <span class="string">mongoreceivedbytes.metric.default</span> <span class="comment"># Mixer instance name (fully-qualified)</span></span><br><span class="line"><span class="attr">    kind:</span> <span class="string">COUNTER</span></span><br><span class="line"><span class="attr">    label_names:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">source_service</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">source_version</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">destination_version</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># Rule to send metric instances to a Prometheus handler</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">rule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">mongoprom</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  match:</span> <span class="string">context.protocol</span> <span class="string">==</span> <span class="string">"tcp"</span></span><br><span class="line">         <span class="string">&amp;&amp;</span> <span class="string">destination.service</span> <span class="string">==</span> <span class="string">"mongodb.default.svc.cluster.local"</span></span><br><span class="line"><span class="attr">  actions:</span></span><br><span class="line"><span class="attr">  - handler:</span> <span class="string">mongohandler.prometheus</span></span><br><span class="line"><span class="attr">    instances:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">mongoreceivedbytes.metric</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">mongosentbytes.metric</span></span><br></pre></td></tr></table></figure><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://kubernetes.feisky.xyz/zh/apps/istio-metrics.html" target="_blank" rel="noopener">istio metrics</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Istio-Metrics&quot;&gt;&lt;a href=&quot;#Istio-Metrics&quot; class=&quot;headerlink&quot; title=&quot;Istio Metrics&quot;&gt;&lt;/a&gt;Istio Metrics&lt;/h1&gt;&lt;h1 id=&quot;Service-Telemetry&quot;&gt;&lt;a
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
      <category term="istio" scheme="https://www.zhengyuyan.com/tags/istio/"/>
    
  </entry>
  
  <entry>
    <title>istio策略管理(五)</title>
    <link href="https://www.zhengyuyan.com/201807/17/istio-policy/"/>
    <id>https://www.zhengyuyan.com/201807/17/istio-policy/</id>
    <published>2018-07-17T13:51:44.000Z</published>
    <updated>2018-11-13T15:19:59.138Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Istio-策略管理"><a href="#Istio-策略管理" class="headerlink" title="Istio 策略管理"></a>Istio 策略管理</h1><p>Mixer 为应用程序和基础架构后端之间提供了一个通用的策略控制层，负责先决条件检查（如认证授权）、配额管理并从 Envoy 代理中收集遥测数据等。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-mixer.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><br>Mixer 支持灵活的插件模型（即 Adapters），支持 GCP、AWS、Prometheus、Heapster 等各种丰富功能的后端。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="istio-adapters.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h1 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h1><p>本质上，Mixer 是一个 属性 处理机，进入 Mixer 的请求带有一系列的属性，Mixer 按照不同的处理阶段处理：</p><ul><li>通过全局 Adapters 为请求引入新的属性</li><li>通过解析（Resolution）识别要用于处理请求的配置资源</li><li>处理属性，生成 Adapter 参数</li><li>分发请求到各个 Adapters 后端处理<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-phase.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure>Adapters 后端以 Mixer 配置 的方式注册到 Istio 中，参考<a href="https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/kube/mixer-rule-ratings-ratelimit.yaml" target="_blank" rel="noopener">这里</a>查看示例配置</li></ul><h1 id="流量限制示例"><a href="#流量限制示例" class="headerlink" title="流量限制示例"></a>流量限制示例</h1><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">memquota</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">handler</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  quotas:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">requestcount.quota.istio-system</span></span><br><span class="line"><span class="attr">    maxAmount:</span> <span class="number">5000</span></span><br><span class="line"><span class="attr">    validDuration:</span> <span class="number">1</span><span class="string">s</span></span><br><span class="line">    <span class="comment"># The first matching override is applied.</span></span><br><span class="line">    <span class="comment"># A requestcount instance is checked against override dimensions.</span></span><br><span class="line"><span class="attr">    overrides:</span></span><br><span class="line">    <span class="comment"># The following override applies to 'ratings' when</span></span><br><span class="line">    <span class="comment"># the source is 'reviews'.</span></span><br><span class="line"><span class="attr">    - dimensions:</span></span><br><span class="line"><span class="attr">        destination:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">        source:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">      maxAmount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">      validDuration:</span> <span class="number">1</span><span class="string">s</span></span><br><span class="line">    <span class="comment"># The following override applies to 'ratings' regardless</span></span><br><span class="line">    <span class="comment"># of the source.</span></span><br><span class="line"><span class="attr">    - dimensions:</span></span><br><span class="line"><span class="attr">        destination:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">      maxAmount:</span> <span class="number">100</span></span><br><span class="line"><span class="attr">      validDuration:</span> <span class="number">1</span><span class="string">s</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">quota</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">requestcount</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  dimensions:</span></span><br><span class="line"><span class="attr">    source:</span> <span class="string">source.labels["app"]</span> <span class="string">| source.service | "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    sourceVersion:</span> <span class="string">source.labels["version"]</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    destination:</span> <span class="string">destination.labels["app"]</span> <span class="string">| destination.service | "unknown"</span></span><br><span class="line"><span class="string"></span><span class="attr">    destinationVersion:</span> <span class="string">destination.labels["version"]</span> <span class="string">| "unknown"</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">---</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">rule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">quota</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  actions:</span></span><br><span class="line"><span class="attr">  - handler:</span> <span class="string">handler.memquota</span></span><br><span class="line"><span class="attr">    instances:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">requestcount.quota</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">config.istio.io/v1alpha2</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">QuotaSpec</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  creationTimestamp:</span> <span class="literal">null</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">request-count</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  rules:</span></span><br><span class="line"><span class="attr">  - quotas:</span></span><br><span class="line"><span class="attr">    - charge:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">      quota:</span> <span class="string">RequestCount</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">config.istio.io/v1alpha2</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">QuotaSpecBinding</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  creationTimestamp:</span> <span class="literal">null</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">request-count</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  quotaSpecs:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">request-count</span></span><br><span class="line"><span class="attr">    namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">  services:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">details</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">productpage</span></span><br></pre></td></tr></table></figure><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://kubernetes.feisky.xyz/zh/apps/istio-policy.html" target="_blank" rel="noopener">istio策略管理</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Istio-策略管理&quot;&gt;&lt;a href=&quot;#Istio-策略管理&quot; class=&quot;headerlink&quot; title=&quot;Istio 策略管理&quot;&gt;&lt;/a&gt;Istio 策略管理&lt;/h1&gt;&lt;p&gt;Mixer 为应用程序和基础架构后端之间提供了一个通用的策略控制层，负责先决
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
      <category term="istio" scheme="https://www.zhengyuyan.com/tags/istio/"/>
    
  </entry>
  
  <entry>
    <title>istio安全管理(四)</title>
    <link href="https://www.zhengyuyan.com/201807/17/istio-aq/"/>
    <id>https://www.zhengyuyan.com/201807/17/istio-aq/</id>
    <published>2018-07-17T13:48:36.000Z</published>
    <updated>2018-11-13T15:19:59.133Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Istio-安全管理"><a href="#Istio-安全管理" class="headerlink" title="Istio 安全管理"></a>Istio 安全管理</h1><p>Istio 提供了 RBAC 访问控制以及双向 TLS 认证等安全管理功能。</p><h1 id="RBAC"><a href="#RBAC" class="headerlink" title="RBAC"></a>RBAC</h1><p>Istio Role-Based Access Control (RBAC) 提供了 namespace、service 以及 method 级别的访问控制。其特性包括</p><ul><li>简单易用：提供基于角色的语意</li><li>支持认证：提供服务 - 服务和用户 - 服务的认证</li><li>灵活：提供角色和角色绑定的自定义属性<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/rbac.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></li></ul><h1 id="开启RBAC"><a href="#开启RBAC" class="headerlink" title="开启RBAC"></a>开启RBAC</h1><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Enable RBAC for default namespace</span></span><br><span class="line"><span class="string">istioctl</span> <span class="string">create</span> <span class="bullet">-f</span> <span class="string">samples/bookinfo/kube/istio-rbac-enable.yaml</span></span><br></pre></td></tr></table></figure><h1 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h1><p>在实现原理上，Istio RBAC 作为 Mixer Adaper 对请求上下文（Request Context）进行认证，并返回授权结果：ALLOW 或者 DENY。请求上下文包含访问对象和动作等两部分，如<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">authorization</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">requestcontext</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  subject:</span></span><br><span class="line"><span class="attr">    user:</span> <span class="string">source.user</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">    groups:</span> <span class="string">""</span></span><br><span class="line"><span class="attr">    properties:</span></span><br><span class="line"><span class="attr">      app:</span> <span class="string">source.labels["app"]</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">      version:</span> <span class="string">source.labels["version"]</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">      namespace:</span> <span class="string">source.namespace</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">  action:</span></span><br><span class="line"><span class="attr">    namespace:</span> <span class="string">destination.namespace</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">    service:</span> <span class="string">destination.service</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">    method:</span> <span class="string">request.method</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">    path:</span> <span class="string">request.path</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">    properties:</span></span><br><span class="line"><span class="attr">      app:</span> <span class="string">destination.labels["app"]</span> <span class="string">| ""</span></span><br><span class="line"><span class="string"></span><span class="attr">      version:</span> <span class="string">destination.labels["version"]</span> <span class="string">| ""</span></span><br><span class="line"><span class="string">---</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">rbac</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">handler</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  config_store_url:</span> <span class="string">"k8s://"</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">rule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">rbaccheck</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">istio-system</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  match:</span> <span class="string">destination.namespace</span> <span class="string">==</span> <span class="string">"default"</span></span><br><span class="line"><span class="attr">  actions:</span></span><br><span class="line"><span class="attr">  - handler:</span> <span class="string">handler.rbac</span></span><br><span class="line"><span class="attr">    instances:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">requestcontext.authorization</span></span><br></pre></td></tr></table></figure></p><h1 id="访问控制"><a href="#访问控制" class="headerlink" title="访问控制"></a>访问控制</h1><p>Istio RBAC 提供了 ServiceRole 和 ServiceRoleBinding 两种资源对象，并以 CustomResourceDefinition (CRD) 的方式管理。</p><ul><li>ServiceRole 定义了一个可访问特定资源（namespace 之内）的服务角色，并支持以前缀通配符和后缀通配符的形式匹配一组服务</li><li>ServiceRoleBinding 定义了赋予指定角色的绑定，即可以指定的角色和动作访问服务<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ServiceRole</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">service-viewer</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  rules:</span></span><br><span class="line"><span class="attr">  - services:</span> <span class="string">["*"]</span></span><br><span class="line"><span class="attr">    methods:</span> <span class="string">["GET"]</span></span><br><span class="line"><span class="attr">    constraints:</span></span><br><span class="line"><span class="attr">    - key:</span> <span class="string">"app"</span></span><br><span class="line"><span class="attr">      values:</span> <span class="string">["productpage",</span> <span class="string">"details"</span><span class="string">,</span> <span class="string">"reviews"</span><span class="string">,</span> <span class="string">"ratings"</span><span class="string">]</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">"config.istio.io/v1alpha2"</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ServiceRoleBinding</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">bind-service-viewer</span></span><br><span class="line"><span class="attr">  namespace:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  subjects:</span></span><br><span class="line"><span class="attr">  - properties:</span></span><br><span class="line"><span class="attr">      namespace:</span> <span class="string">"default"</span></span><br><span class="line"><span class="attr">  - properties:</span></span><br><span class="line"><span class="attr">      namespace:</span> <span class="string">"istio-system"</span></span><br><span class="line"><span class="attr">  roleRef:</span></span><br><span class="line"><span class="attr">    kind:</span> <span class="string">ServiceRole</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">"service-viewer"</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="双向-TLS"><a href="#双向-TLS" class="headerlink" title="双向 TLS"></a>双向 TLS</h1><p>双向 TLS 为服务间通信提供了 TLS 认证，并提供管理系统自动管理密钥和证书的生成、分发、替换以及撤销。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-tls.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h2 id="实现原理-1"><a href="#实现原理-1" class="headerlink" title="实现原理"></a>实现原理</h2><p>Istio Auth 由三部分组成：</p><ul><li>身份（Identity）：Istio 使用 Kubernetes service account 来识别服务的身份，格式为 spiffe://&lt;<em>domain</em>&gt;/ns/&lt;<em>namespace</em>&gt;/sa/&lt;<em>serviceaccount</em>&gt;</li><li>通信安全：端到端 TLS 通信通过服务器端和客户端的 Envoy 容器完成</li><li>证书管理：Istio CA (Certificate Authority) 负责为每个 service account 生成 SPIFEE 密钥和证书、分发到 Pod（通过 Secret Volume Mount 的形式）、定期轮转（Rotate）以及必要时撤销。对于 Kuberentes 之外的服务，CA 配合 Istio node agent 共同完成整个过程。</li></ul><p>这样，一个容器使用证书的流程为</p><ul><li>首先，Istio CA 监听 Kubernetes API，并为 service account 生成 SPIFFE 密钥及证书，再以 secret 形式存储到 Kubernetes 中</li><li>然后，Pod 创建时，Kubernetes API Server 将 secret 挂载到容器中</li><li>最后，Pilot 生成一个访问控制的配置，定义哪些 service account 可以访问服务，并分发给 Envoy</li><li>而当容器间通信时，Pod 双方的 Envoy 就会基于访问控制配置来作认证</li></ul><h1 id="最佳实践"><a href="#最佳实践" class="headerlink" title="最佳实践"></a>最佳实践</h1><ul><li>为不同团队创建不同 namespace 分别管理</li><li>将 Istio CA 运行在单独的 namespace 中，并且仅授予管理员权限</li></ul><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://kubernetes.feisky.xyz/zh/apps/istio-security.html" target="_blank" rel="noopener">istio安全管理</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Istio-安全管理&quot;&gt;&lt;a href=&quot;#Istio-安全管理&quot; class=&quot;headerlink&quot; title=&quot;Istio 安全管理&quot;&gt;&lt;/a&gt;Istio 安全管理&lt;/h1&gt;&lt;p&gt;Istio 提供了 RBAC 访问控制以及双向 TLS 认证等安全管理功能。
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
  </entry>
  
  <entry>
    <title>istio流量管理(三)</title>
    <link href="https://www.zhengyuyan.com/201807/17/istio-traffic/"/>
    <id>https://www.zhengyuyan.com/201807/17/istio-traffic/</id>
    <published>2018-07-17T13:43:40.000Z</published>
    <updated>2018-11-13T15:19:59.130Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Istio-流量管理"><a href="#Istio-流量管理" class="headerlink" title="Istio 流量管理"></a>Istio 流量管理</h1><p>Istio 提供了强大的流量管理功能，如智能路由、服务发现与负载均衡、故障恢复、故障注入等。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-traffic-manage.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><br>流量管理的功能由 Pilot 配合 Envoy 负责，并接管进入和离开容器的所有流量：<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-request-flow.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h1 id="API-版本"><a href="#API-版本" class="headerlink" title="API 版本"></a>API 版本</h1><p>Istio 0.7.X 及以前版本仅支持 config.istio.io/v1alpha2，0.8.0 将其升级为 networking.istio.io/v1alpha3，并且重命名了流量管理的几个资源对象：</p><ul><li>RouteRule -&gt; VirtualService</li><li>DestinationPolicy -&gt; DestinationRule</li><li>EgressRule -&gt; ExternalService</li><li>Ingress -&gt; Gateway</li></ul><h1 id="服务发现和负载均衡"><a href="#服务发现和负载均衡" class="headerlink" title="服务发现和负载均衡"></a>服务发现和负载均衡</h1><p>为了接管流量，Istio 假设所有容器在启动时自动将自己注册到 Istio 中（通过自动或手动给 Pod 注入 Envoy sidecar 容器）。Envoy 收到外部请求后，会对请求作负载均衡，并支持轮询、随机和加权最少请求等负载均衡算法。除此之外，Envoy 还会以熔断机制定期检查服务后端容器的健康状态，自动移除不健康的容器和加回恢复正常的容器。容器内也可以返回 HTTP 503 显示将自己从负载均衡中移除。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-service-discovery.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h1 id="流量接管原理"><a href="#流量接管原理" class="headerlink" title="流量接管原理"></a>流量接管原理</h1><p>Envoy sidecar 使用 iptables 把进入 Pod 和从 Pod 发出的流量转发到 Envoy 进程监听的端口（即 15001 端口）上：<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Generated by iptables-save v1.6.0 on Fri Jun  8 07:37:33 2018</span></span><br><span class="line"><span class="meta">*mangle</span></span><br><span class="line"><span class="string">:PREROUTING</span> <span class="string">ACCEPT</span> <span class="string">[2883:1129969]</span></span><br><span class="line"><span class="string">:INPUT</span> <span class="string">ACCEPT</span> <span class="string">[2883:1129969]</span></span><br><span class="line"><span class="string">:FORWARD</span> <span class="string">ACCEPT</span> <span class="string">[0:0]</span></span><br><span class="line"><span class="string">:OUTPUT</span> <span class="string">ACCEPT</span> <span class="string">[58217:6662600]</span></span><br><span class="line"><span class="string">:POSTROUTING</span> <span class="string">ACCEPT</span> <span class="string">[58217:6662600]</span></span><br><span class="line"><span class="string">COMMIT</span></span><br><span class="line"><span class="comment"># Completed on Fri Jun  8 07:37:33 2018</span></span><br><span class="line"><span class="comment"># Generated by iptables-save v1.6.0 on Fri Jun  8 07:37:33 2018</span></span><br><span class="line"><span class="meta">*nat</span></span><br><span class="line"><span class="string">:PREROUTING</span> <span class="string">ACCEPT</span> <span class="string">[0:0]</span></span><br><span class="line"><span class="string">:INPUT</span> <span class="string">ACCEPT</span> <span class="string">[0:0]</span></span><br><span class="line"><span class="string">:OUTPUT</span> <span class="string">ACCEPT</span> <span class="string">[299:27815]</span></span><br><span class="line"><span class="string">:POSTROUTING</span> <span class="string">ACCEPT</span> <span class="string">[299:27815]</span></span><br><span class="line"><span class="string">:ISTIO_INBOUND</span> <span class="bullet">-</span> <span class="string">[0:0]</span></span><br><span class="line"><span class="string">:ISTIO_OUTPUT</span> <span class="bullet">-</span> <span class="string">[0:0]</span></span><br><span class="line"><span class="string">:ISTIO_REDIRECT</span> <span class="bullet">-</span> <span class="string">[0:0]</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">PREROUTING</span> <span class="bullet">-p</span> <span class="string">tcp</span> <span class="bullet">-j</span> <span class="string">ISTIO_INBOUND</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">OUTPUT</span> <span class="bullet">-p</span> <span class="string">tcp</span> <span class="bullet">-j</span> <span class="string">ISTIO_OUTPUT</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_INBOUND</span> <span class="bullet">-p</span> <span class="string">tcp</span> <span class="bullet">-m</span> <span class="string">tcp</span> <span class="bullet">--dport</span> <span class="number">9080</span> <span class="bullet">-j</span> <span class="string">ISTIO_REDIRECT</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_OUTPUT</span> <span class="string">!</span> <span class="bullet">-d</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span><span class="string">/32</span> <span class="bullet">-o</span> <span class="string">lo</span> <span class="bullet">-j</span> <span class="string">ISTIO_REDIRECT</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_OUTPUT</span> <span class="bullet">-m</span> <span class="string">owner</span> <span class="bullet">--uid-owner</span> <span class="number">1337</span> <span class="bullet">-j</span> <span class="string">RETURN</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_OUTPUT</span> <span class="bullet">-m</span> <span class="string">owner</span> <span class="bullet">--gid-owner</span> <span class="number">1337</span> <span class="bullet">-j</span> <span class="string">RETURN</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_OUTPUT</span> <span class="bullet">-d</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span><span class="string">/32</span> <span class="bullet">-j</span> <span class="string">RETURN</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_OUTPUT</span> <span class="bullet">-j</span> <span class="string">ISTIO_REDIRECT</span></span><br><span class="line"><span class="bullet">-</span><span class="string">A</span> <span class="string">ISTIO_REDIRECT</span> <span class="bullet">-p</span> <span class="string">tcp</span> <span class="bullet">-j</span> <span class="string">REDIRECT</span> <span class="bullet">--to-ports</span> <span class="number">15001</span></span><br><span class="line"><span class="string">COMMIT</span></span><br><span class="line"><span class="comment"># Completed on Fri Jun  8 07:37:33 2018</span></span><br></pre></td></tr></table></figure></p><h1 id="故障恢复"><a href="#故障恢复" class="headerlink" title="故障恢复"></a>故障恢复</h1><p>Istio 提供了一系列开箱即用的故障恢复功能，如</p><ul><li>超时处理</li><li>重试处理，如限制最大重试时间以及可变重试间隔</li><li>健康检查，如自动移除不健康的容器</li><li>请求限制，如并发请求数和并发连接数</li><li>熔断</li></ul><p>这些功能均可以使用 VirtualService 动态配置。比如以下为用户 jason 的请求返回 500 （而其他用户均可正常访问）：<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - match:</span></span><br><span class="line"><span class="attr">    - headers:</span></span><br><span class="line"><span class="attr">        cookie:</span></span><br><span class="line"><span class="attr">          regex:</span> <span class="string">"^(.*?;)?(user=jason)(;.*)?$"</span></span><br><span class="line"><span class="attr">    fault:</span></span><br><span class="line"><span class="attr">      abort:</span></span><br><span class="line"><span class="attr">        percent:</span> <span class="number">100</span></span><br><span class="line"><span class="attr">        httpStatus:</span> <span class="number">500</span></span><br><span class="line"><span class="attr">    route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br></pre></td></tr></table></figure></p><p>熔断示例：<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DestinationRule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  host:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">  trafficPolicy:</span></span><br><span class="line"><span class="attr">    connectionPool:</span></span><br><span class="line"><span class="attr">      tcp:</span></span><br><span class="line"><span class="attr">        maxConnections:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">      http:</span></span><br><span class="line"><span class="attr">        http1MaxPendingRequests:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">        maxRequestsPerConnection:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">    outlierDetection:</span></span><br><span class="line"><span class="attr">      http:</span></span><br><span class="line"><span class="attr">        consecutiveErrors:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">        interval:</span> <span class="number">1</span><span class="string">s</span></span><br><span class="line"><span class="attr">        baseEjectionTime:</span> <span class="number">3</span><span class="string">m</span></span><br><span class="line"><span class="attr">        maxEjectionPercent:</span> <span class="number">100</span></span><br></pre></td></tr></table></figure></p><h1 id="故障注入"><a href="#故障注入" class="headerlink" title="故障注入"></a>故障注入</h1><p>Istio 支持为应用注入故障，以模拟实际生产中碰到的各种问题，包括</p><ul><li>注入延迟（模拟网络延迟和服务过载）</li><li>注入失败（模拟应用失效）<br>这些故障均可以使用 VirtualService 动态配置。如以下配置 2 秒的延迟：<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - fault:</span></span><br><span class="line"><span class="attr">      delay:</span></span><br><span class="line"><span class="attr">        percent:</span> <span class="number">100</span></span><br><span class="line"><span class="attr">        fixedDelay:</span> <span class="number">2</span><span class="string">s</span></span><br><span class="line"><span class="attr">    route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="金丝雀部署"><a href="#金丝雀部署" class="headerlink" title="金丝雀部署"></a>金丝雀部署</h1><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-service-versions.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><p>首先部署 bookinfo，并配置默认路由为 v1 版本：<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">productpage</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">productpage</span></span><br><span class="line"><span class="attr">  gateways:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">bookinfo</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">productpage</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">details</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">details</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">details</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DestinationRule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">productpage</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  host:</span> <span class="string">productpage</span></span><br><span class="line"><span class="attr">  subsets:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v1</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DestinationRule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  subsets:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v3</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v3</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DestinationRule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  host:</span> <span class="string">ratings</span></span><br><span class="line"><span class="attr">  subsets:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v2-mysql</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v2-mysql</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v2-mysql-vm</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v2-mysql-vm</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DestinationRule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">details</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  host:</span> <span class="string">details</span></span><br><span class="line"><span class="attr">  subsets:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v2</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure></p><p>示例一：将 10% 请求发送到 v2 版本而其余 90% 发送到 v1 版本<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">      weight:</span> <span class="number">90</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">      weight:</span> <span class="number">10</span></span><br></pre></td></tr></table></figure></p><p>示例二：将 jason 用户的请求全部发到 v2 版本<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - match:</span></span><br><span class="line"><span class="attr">    - headers:</span></span><br><span class="line"><span class="attr">        cookie:</span></span><br><span class="line"><span class="attr">          regex:</span> <span class="string">"^(.*?;)?(user=jason)(;.*)?$"</span></span><br><span class="line"><span class="attr">    route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v2</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br></pre></td></tr></table></figure></p><p>示例三：全部切换到 v2 版本<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v2</span></span><br></pre></td></tr></table></figure></p><p>示例四：限制并发访问<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DestinationRule</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  host:</span> <span class="string">reviews</span></span><br><span class="line"><span class="attr">  subsets:</span></span><br><span class="line"><span class="attr">  - name:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      version:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">    trafficPolicy:</span></span><br><span class="line"><span class="attr">      connectionPool:</span></span><br><span class="line"><span class="attr">        tcp:</span></span><br><span class="line"><span class="attr">          maxConnections:</span> <span class="number">100</span></span><br></pre></td></tr></table></figure></p><h1 id="Istio-Ingress"><a href="#Istio-Ingress" class="headerlink" title="Istio Ingress"></a>Istio Ingress</h1><p>Istio 在部署时会自动创建一个 Istio Gateway，用来控制 Ingress 访问。<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># prepare自动注入</span></span><br><span class="line"><span class="string">kubectl</span> <span class="string">apply</span> <span class="bullet">-f</span> <span class="string">samples/httpbin/httpbin.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># get ingress external IP (suppose load balancer service)</span></span><br><span class="line"><span class="string">kubectl</span> <span class="string">get</span> <span class="string">svc</span> <span class="string">istio-ingressgateway</span> <span class="bullet">-n</span> <span class="string">istio-system</span></span><br><span class="line"><span class="string">export</span> <span class="string">INGRESS_HOST=$(kubectl</span> <span class="bullet">-n</span> <span class="string">istio-system</span> <span class="string">get</span> <span class="string">service</span> <span class="string">istio-ingressgateway</span> <span class="bullet">-o</span> <span class="string">jsonpath='&#123;.status.loadBalancer.ingress[0].ip&#125;')</span></span><br><span class="line"><span class="string">export</span> <span class="string">INGRESS_PORT=$(kubectl</span> <span class="bullet">-n</span> <span class="string">istio-system</span> <span class="string">get</span> <span class="string">service</span> <span class="string">istio-ingressgateway</span> <span class="bullet">-o</span> <span class="string">jsonpath='&#123;.spec.ports[?(@.name=="http")].port&#125;')</span></span><br><span class="line"><span class="string">export</span> <span class="string">SECURE_INGRESS_PORT=$(kubectl</span> <span class="bullet">-n</span> <span class="string">istio-system</span> <span class="string">get</span> <span class="string">service</span> <span class="string">istio-ingressgateway</span> <span class="bullet">-o</span> <span class="string">jsonpath='&#123;.spec.ports[?(@.name=="https")].port&#125;')</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># create gateway</span></span><br><span class="line"><span class="string">cat</span> <span class="string">&lt;&lt;EOF</span> <span class="string">| istioctl create -f -</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Gateway</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin-gateway</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  selector:</span></span><br><span class="line"><span class="attr">    istio:</span> <span class="string">ingressgateway</span> <span class="comment"># use Istio default gateway implementation</span></span><br><span class="line"><span class="attr">  servers:</span></span><br><span class="line"><span class="attr">  - port:</span></span><br><span class="line"><span class="attr">      number:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">      protocol:</span> <span class="string">HTTP</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"httpbin.example.com"</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># configure routes for the gateway</span></span><br><span class="line"><span class="string">cat</span> <span class="string">&lt;&lt;EOF</span> <span class="string">| istioctl create -f -</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">"httpbin.example.com"</span></span><br><span class="line"><span class="attr">  gateways:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">httpbin-gateway</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - match:</span></span><br><span class="line"><span class="attr">    - uri:</span></span><br><span class="line"><span class="attr">        prefix:</span> <span class="string">/status</span></span><br><span class="line"><span class="attr">    - uri:</span></span><br><span class="line"><span class="attr">        prefix:</span> <span class="string">/delay</span></span><br><span class="line"><span class="attr">    route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        port:</span></span><br><span class="line"><span class="attr">          number:</span> <span class="number">8000</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># validate 200</span></span><br><span class="line"><span class="string">curl</span> <span class="bullet">--resolve</span> <span class="string">httpbin.example.com:$INGRESS_PORT:$INGRESS_HOST</span> <span class="attr">-HHost:httpbin.example.com</span> <span class="bullet">-I</span> <span class="attr">http://httpbin.example.com:$INGRESS_PORT/status/200</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># invalidate 404</span></span><br><span class="line"><span class="string">curl</span> <span class="bullet">--resolve</span> <span class="string">httpbin.example.com:$INGRESS_PORT:$INGRESS_HOST</span> <span class="attr">-HHost:httpbin.example.com</span> <span class="bullet">-I</span> <span class="attr">http://httpbin.example.com:$INGRESS_PORT/headers</span></span><br></pre></td></tr></table></figure></p><p>使用 TLS：<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 生成证书</span></span><br><span class="line"><span class="string">git</span> <span class="string">clone</span> <span class="attr">https://github.com/nicholasjackson/mtls-go-example</span></span><br><span class="line"></span><br><span class="line"><span class="string">cd</span> <span class="string">mtls-go-example</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#该命令将产生四个目录：1_root，2_intermediate，3_application和4_client与你将使用客户端和服务器证书。</span></span><br><span class="line"><span class="string">generate.sh</span> <span class="string">bookinfo.example.com</span> <span class="string">&lt;password&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># istio-ingressgateway-certs必须在istio-system命名空间中</span></span><br><span class="line"><span class="string">kubectl</span> <span class="string">create</span> <span class="bullet">-n</span> <span class="string">istio-system</span> <span class="string">secret</span> <span class="string">tls</span> <span class="string">istio-ingressgateway-certs</span> <span class="bullet">--key</span> <span class="number">3</span><span class="string">_application/private/httpbin.example.com.key.pem</span> <span class="bullet">--cert</span> <span class="number">3</span><span class="string">_application/certs/httpbin.example.com.cert.pem</span></span><br><span class="line"></span><br><span class="line"><span class="string">cat</span> <span class="string">&lt;&lt;EOF</span> <span class="string">| istioctl replace -f -</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Gateway</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin-gateway</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  selector:</span></span><br><span class="line"><span class="attr">    istio:</span> <span class="string">ingressgateway</span> <span class="comment"># use istio default ingress gateway</span></span><br><span class="line"><span class="attr">  servers:</span></span><br><span class="line"><span class="attr">  - port:</span></span><br><span class="line"><span class="attr">      number:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">      protocol:</span> <span class="string">HTTP</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"httpbin.example.com"</span></span><br><span class="line"><span class="attr">  - port:</span></span><br><span class="line"><span class="attr">      number:</span> <span class="number">443</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">https</span></span><br><span class="line"><span class="attr">      protocol:</span> <span class="string">HTTPS</span></span><br><span class="line"><span class="attr">    tls:</span></span><br><span class="line"><span class="attr">      mode:</span> <span class="string">SIMPLE</span></span><br><span class="line"><span class="attr">      serverCertificate:</span> <span class="string">/etc/istio/ingressgateway-certs/tls.crt</span></span><br><span class="line"><span class="attr">      privateKey:</span> <span class="string">/etc/istio/ingressgateway-certs/tls.key</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"httpbin.example.com"</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># validate 200</span></span><br><span class="line"><span class="string">curl</span> <span class="bullet">--resolve</span> <span class="string">httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST</span> <span class="attr">-HHost:httpbin.example.com</span> <span class="bullet">-I</span> <span class="bullet">-k</span> <span class="attr">https://httpbin.example.com:$SECURE_INGRESS_PORT/status/200</span></span><br></pre></td></tr></table></figure></p><h1 id="Egress-流量"><a href="#Egress-流量" class="headerlink" title="Egress 流量"></a>Egress 流量</h1><p>默认情况下，Istio 接管了容器的内外网流量，从容器内部无法访问 Kubernetes 集群外的服务。可以通过 ServiceEntry 为需要的容器开放 Egress 访问，如<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="string">$</span> <span class="string">cat</span> <span class="string">&lt;&lt;EOF</span> <span class="string">| istioctl create -f -</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ServiceEntry</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin-ext</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">httpbin.org</span></span><br><span class="line"><span class="attr">  ports:</span></span><br><span class="line"><span class="attr">  - number:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">    protocol:</span> <span class="string">HTTP</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="string">$</span> <span class="string">cat</span> <span class="string">&lt;&lt;EOF</span> <span class="string">| istioctl create -f -</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin-ext</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">httpbin.org</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - timeout:</span> <span class="number">3</span><span class="string">s</span></span><br><span class="line"><span class="attr">    route:</span></span><br><span class="line"><span class="attr">      - destination:</span></span><br><span class="line"><span class="attr">          host:</span> <span class="string">httpbin.org</span></span><br><span class="line"><span class="attr">        weight:</span> <span class="number">100</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure></p><p>需要注意的是 ServiceEntry 仅支持 HTTP、TCP 和 HTTPS，对于其他协议需要通过 –includeIPRanges 的方式设置 IP 地址范围，如<br><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">helm template @install/kubernetes/helm/istio@ --name istio --namespace istio-system --set global.proxy.includeIPRanges="10.0.0.1/24" -x @templates/sidecar-injector-configmap.yaml@ | kubectl apply -f -</span><br></pre></td></tr></table></figure></p><h1 id="流量镜像"><a href="#流量镜像" class="headerlink" title="流量镜像"></a>流量镜像</h1><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="string">cat</span> <span class="string">&lt;&lt;EOF</span> <span class="string">| istioctl replace -f -</span></span><br><span class="line"><span class="string"></span><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">        subset:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">      weight:</span> <span class="number">100</span></span><br><span class="line"><span class="attr">    mirror:</span></span><br><span class="line"><span class="attr">      host:</span> <span class="string">httpbin</span></span><br><span class="line"><span class="attr">      subset:</span> <span class="string">v2</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://istio.io/docs/tasks/traffic-management/" target="_blank" rel="noopener">istio官方文档</a><br><a href="https://kubernetes.feisky.xyz/zh/apps/istio-traffic-management.html" target="_blank" rel="noopener">istio流量管理</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Istio-流量管理&quot;&gt;&lt;a href=&quot;#Istio-流量管理&quot; class=&quot;headerlink&quot; title=&quot;Istio 流量管理&quot;&gt;&lt;/a&gt;Istio 流量管理&lt;/h1&gt;&lt;p&gt;Istio 提供了强大的流量管理功能，如智能路由、服务发现与负载均衡、故障恢
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
      <category term="istio" scheme="https://www.zhengyuyan.com/tags/istio/"/>
    
  </entry>
  
  <entry>
    <title>istio官方示例bookinfo</title>
    <link href="https://www.zhengyuyan.com/201807/17/bookinfo/"/>
    <id>https://www.zhengyuyan.com/201807/17/bookinfo/</id>
    <published>2018-07-17T13:38:19.000Z</published>
    <updated>2018-11-13T15:19:59.140Z</updated>
    
    <content type="html"><![CDATA[<h1 id="官方bookinfo示例"><a href="#官方bookinfo示例" class="headerlink" title="官方bookinfo示例"></a>官方bookinfo示例</h1><p>bookinfo显示有关书籍的信息，类似于在线书店的单个商品。页面上显示的是书籍，书籍详细信息（ISBN，页数等）以及一些书评。</p><p>Bookinfo应用程序分为四个独立的微服务：</p><ul><li>productpage。productpage微服务调用详细信息并查看微服务以填充页面。</li><li>details。details微服务包含书籍信息。</li><li>reviews。reviews微服务包含书评。它还称为评级微服务。</li><li>ratings。ratings微服务包含伴随书评的书籍排名信息。</li></ul><p>reviews微服务有3个版本：</p><ul><li>版本v1不会调用评级服务。</li><li>版本v2调用评级服务，并将每个评级显示为1到5个黑色星。</li><li>版本v3调用评级服务，并将每个评级显示为1到5个红星。</li></ul><p>应用程序的端到端架构如下所示。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="./images/noistio.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h2 id="部署应用程序"><a href="#部署应用程序" class="headerlink" title="部署应用程序"></a>部署应用程序</h2><p>使用Istio不需要更改应用程序本身。相反，我们只需要在启用Istio的环境中配置和运行服务，并在每个服务旁边注入Envoy边车。所需的命令和配置因运行时环境而异，但在所有情况下，生成的部署将如下所示：<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/withistio.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><ul><li>创建istio-app命名空间<code>kubectl create namespace istio-app</code></li><li>将<code>istio-app</code>命名空间设置为自动注入标签<code>kubectl label namespace istio-app istio-injection=enabled</code></li><li>执行<code>kubectl apply -f samples/bookinfo/kube/bookinfo.yaml</code><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/istio-app.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure>部署好的productpage会自动注入sideCar<figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/productpage.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></li><li><p>为程序定义网关入口<code>istioctl create -f gateway/gateway.yaml -n istio-app</code></p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Gateway</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">istio-gateway</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  selector:</span></span><br><span class="line"><span class="attr">    istio:</span> <span class="string">ingressgateway</span> <span class="comment"># use istio default controller</span></span><br><span class="line"><span class="attr">  servers:</span></span><br><span class="line"><span class="attr">  - port:</span></span><br><span class="line"><span class="attr">      number:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">      protocol:</span> <span class="string">HTTP</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"bookinfo.example.com"</span></span><br></pre></td></tr></table></figure></li><li><p>创建VirtualService</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">bookinfo</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">"bookinfo.example.com"</span></span><br><span class="line"><span class="attr">  gateways:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">istio-gateway</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - match:</span></span><br><span class="line"><span class="attr">    - uri:</span></span><br><span class="line"><span class="attr">        exact:</span> <span class="string">/productpage</span></span><br><span class="line"><span class="attr">    - uri:</span></span><br><span class="line"><span class="attr">        exact:</span> <span class="string">/login</span></span><br><span class="line"><span class="attr">    - uri:</span></span><br><span class="line"><span class="attr">        exact:</span> <span class="string">/logout</span></span><br><span class="line"><span class="attr">    - uri:</span></span><br><span class="line"><span class="attr">        prefix:</span> <span class="string">/api/v1/products</span></span><br><span class="line"><span class="attr">    route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">productpage.istio-app.svc.cluster.local</span></span><br><span class="line"><span class="attr">        port:</span></span><br><span class="line"><span class="attr">          number:</span> <span class="number">9080</span></span><br></pre></td></tr></table></figure></li></ul><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://istio.io/docs/guides/bookinfo/" target="_blank" rel="noopener">isito官方示例</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;官方bookinfo示例&quot;&gt;&lt;a href=&quot;#官方bookinfo示例&quot; class=&quot;headerlink&quot; title=&quot;官方bookinfo示例&quot;&gt;&lt;/a&gt;官方bookinfo示例&lt;/h1&gt;&lt;p&gt;bookinfo显示有关书籍的信息，类似于在线书店的单个商品
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
      <category term="istio" scheme="https://www.zhengyuyan.com/tags/istio/"/>
    
  </entry>
  
  <entry>
    <title>istio 安装(二)</title>
    <link href="https://www.zhengyuyan.com/201807/17/istio-install/"/>
    <id>https://www.zhengyuyan.com/201807/17/istio-install/</id>
    <published>2018-07-17T13:28:42.000Z</published>
    <updated>2018-11-13T15:19:59.142Z</updated>
    
    <content type="html"><![CDATA[<h1 id="istio安装"><a href="#istio安装" class="headerlink" title="istio安装"></a>istio安装</h1><p><a href="https://istio.io/docs/setup/" target="_blank" rel="noopener">istio官网安装</a>提供了多种方法，因为集群中包含helm，所以选择用helm安装istio</p><ul><li><a href="https://github.com/istio/istio/releases" target="_blank" rel="noopener">下载</a>istio release(目前版本为0.8.0)</li><li>命令行执行<code>helm install install/kubernetes/helm/istio --name istio --namespace istio-system</code>(此命令采取自动注入sideCar)</li></ul><p>istio的helm的value.yaml文件如下:<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Use --set or additional values.yaml file to configure settings.</span></span><br><span class="line"><span class="comment"># This file no longer uses sed, updateVersions.sh or istio.VERSIONS</span></span><br><span class="line"><span class="comment"># <span class="doctag">TODO:</span> evaluate if we need individual overrides for each component version, istio</span></span><br><span class="line"><span class="comment"># is not typically tested with a mix of versions. Only supported case is version upgrade.</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Common settings.</span></span><br><span class="line"><span class="attr">global:</span></span><br><span class="line">  <span class="comment"># Default repository for Istio images.</span></span><br><span class="line">  <span class="comment"># Releases are published to docker hub under 'istio' project.</span></span><br><span class="line">  <span class="comment"># Daily builds from prow are on gcr.io, and nightly builds from circle on</span></span><br><span class="line">  <span class="comment"># docker.io/istionightly</span></span><br><span class="line"><span class="attr">  hub:</span> <span class="number">192.168</span><span class="number">.30</span><span class="number">.100</span><span class="string">:8889/istio</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Default tag for Istio images.</span></span><br><span class="line">  <span class="comment"># Should track latest released version in the branch.</span></span><br><span class="line"><span class="attr">  tag:</span> <span class="number">0.8</span><span class="number">.0</span></span><br><span class="line"><span class="attr">  proxy:</span></span><br><span class="line"><span class="attr">    image:</span> <span class="string">proxyv2</span></span><br><span class="line"><span class="attr">    resources:</span></span><br><span class="line"><span class="attr">      requests:</span></span><br><span class="line"><span class="attr">        cpu:</span> <span class="number">100</span><span class="string">m</span></span><br><span class="line"><span class="attr">        memory:</span> <span class="number">128</span><span class="string">Mi</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># istio-sidecar-injector configmap stores configuration for sidecar injection.</span></span><br><span class="line">    <span class="comment"># This config map is used by istioctl kube-inject and the injector webhook.</span></span><br><span class="line"><span class="attr">    enableCoreDump:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">    serviceAccountName:</span> <span class="string">default</span> <span class="comment"># used only if RBAC is not enabled</span></span><br><span class="line"><span class="attr">    replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">    resources:</span></span><br><span class="line"><span class="attr">      requests:</span></span><br><span class="line"><span class="attr">        cpu:</span> <span class="number">100</span><span class="string">m</span></span><br><span class="line"><span class="attr">        memory:</span> <span class="number">128</span><span class="string">Mi</span></span><br><span class="line">    <span class="comment"># limits:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># istio egress capture whitelist</span></span><br><span class="line">    <span class="comment"># https://istio.io/docs/tasks/traffic-management/egress.html#calling-external-services-directly</span></span><br><span class="line">    <span class="comment"># example: includeIPRanges: "172.30.0.0/16,172.20.0.0/16"</span></span><br><span class="line">    <span class="comment"># would only capture egress traffic on those two IP Ranges, all other outbound traffic would</span></span><br><span class="line">    <span class="comment"># be allowed by the sidecar</span></span><br><span class="line"><span class="attr">    includeIPRanges:</span> <span class="string">"*"</span></span><br><span class="line"><span class="attr">    excludeIPRanges:</span> <span class="string">""</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># istio ingress capture whitelist</span></span><br><span class="line">    <span class="comment"># examples:</span></span><br><span class="line">    <span class="comment">#     Redirect no inbound traffic to Envoy:    --includeInboundPorts=""</span></span><br><span class="line">    <span class="comment">#     Redirect all inbound traffic to Envoy:   --includeInboundPorts="*"</span></span><br><span class="line">    <span class="comment">#     Redirect only selected ports:            --includeInboundPorts="80,8080"</span></span><br><span class="line"><span class="attr">    includeInboundPorts:</span> <span class="string">"*"</span></span><br><span class="line"><span class="attr">    excludeInboundPorts:</span> <span class="string">""</span></span><br><span class="line"><span class="attr">    policy:</span> <span class="string">enabled</span></span><br><span class="line"></span><br><span class="line"><span class="attr">  proxy_init:</span></span><br><span class="line"><span class="attr">    image:</span> <span class="string">proxy_init</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># imagePullPolicy is applied to istio control plane components.</span></span><br><span class="line">  <span class="comment"># local tests require IfNotPresent, to avoid uploading to dockerhub.</span></span><br><span class="line">  <span class="comment"># <span class="doctag">TODO:</span> Switch to Always as default, and override in the local tests.</span></span><br><span class="line"><span class="attr">  imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Not recommended for user to configure this. Hyperkube image to use when creating custom resources</span></span><br><span class="line"><span class="attr">  hyperkube:</span></span><br><span class="line"><span class="attr">    repository:</span> <span class="number">192.168</span><span class="number">.30</span><span class="number">.100</span><span class="string">:8889/coreos/hyperkube</span></span><br><span class="line"><span class="attr">    tag:</span> <span class="string">v1.7.6_coreos.0</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># controlPlaneMtls enabled. Will result in delays starting the pods while secrets are</span></span><br><span class="line">  <span class="comment"># propagated, not recommended for tests.</span></span><br><span class="line"><span class="attr">  controlPlaneSecurityEnabled:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Default mtls policy. If true, mtls between services will be enabled by default.</span></span><br><span class="line"><span class="attr">  mtls:</span></span><br><span class="line">    <span class="comment"># Default setting for service-to-service mtls. Can be set explicitly using</span></span><br><span class="line">    <span class="comment"># destination rules or service annotations.</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">false</span></span><br><span class="line">    <span class="comment"># List of fully qualified services to exclude from mtls</span></span><br><span class="line">    <span class="comment"># <span class="doctag">TODO:</span> add the templating.</span></span><br><span class="line"><span class="attr">    mtlsExcludedServices:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"kubernetes.default.svc.cluster.local"</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># create RBAC resources. Must be set for any cluster configured with rbac.</span></span><br><span class="line"><span class="attr">  rbacEnabled:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">  <span class="comment">## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.</span></span><br><span class="line">  <span class="comment"># imagePullSecrets:</span></span><br><span class="line">  <span class="comment">#   - name: "private-registry-key"</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Default is 1 second</span></span><br><span class="line"><span class="attr">  refreshInterval:</span> <span class="number">10</span><span class="string">s</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Enable multicluster operation.  Must be set to true if multicluster operation</span></span><br><span class="line">  <span class="comment"># is desired.</span></span><br><span class="line"><span class="attr">  multicluster:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Specify pod scheduling arch(amd64, ppc64le, s390x) and weight as follows:</span></span><br><span class="line">  <span class="comment">#   0 - Never scheduled</span></span><br><span class="line">  <span class="comment">#   1 - Least preferred</span></span><br><span class="line">  <span class="comment">#   2 - No preference</span></span><br><span class="line">  <span class="comment">#   3 - Most preferred</span></span><br><span class="line"><span class="attr">  arch:</span></span><br><span class="line"><span class="attr">    amd64:</span> <span class="number">2</span></span><br><span class="line"><span class="attr">    s390x:</span> <span class="number">2</span></span><br><span class="line"><span class="attr">    ppc64le:</span> <span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Any customization for istio testing should be here</span></span><br><span class="line"><span class="attr">istiotesting:</span></span><br><span class="line"><span class="attr">  oneNameSpace:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># ingress configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">ingress:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">  autoscaleMin:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  autoscaleMax:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line"><span class="comment"># limits:</span></span><br><span class="line"><span class="comment">#  cpu: 100m</span></span><br><span class="line"><span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="comment"># requests:</span></span><br><span class="line"><span class="comment">#  cpu: 100m</span></span><br><span class="line"><span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    loadBalancerIP:</span> <span class="string">"10.100.100.20"</span></span><br><span class="line"><span class="attr">    type:</span> <span class="string">LoadBalancer</span> <span class="comment">#change to NodePort, ClusterIP or LoadBalancer if need be</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">      nodePort:</span> <span class="number">32000</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">443</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">https</span></span><br><span class="line"><span class="attr">    selector:</span></span><br><span class="line"><span class="attr">      istio:</span> <span class="string">ingress</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># ingressgateway configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">ingressgateway:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">istio-ingressgateway-service-account</span></span><br><span class="line"><span class="attr">  autoscaleMin:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  autoscaleMax:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line"><span class="comment"># limits:</span></span><br><span class="line"><span class="comment">#  cpu: 100m</span></span><br><span class="line"><span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="comment"># requests:</span></span><br><span class="line"><span class="comment">#  cpu: 100m</span></span><br><span class="line"><span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">istio-ingressgateway</span> <span class="comment">#DNS addressible</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      istio:</span> <span class="string">ingressgateway</span></span><br><span class="line">    <span class="comment">#namespace: istio-system</span></span><br><span class="line"><span class="attr">    loadBalancerIP:</span> <span class="string">"10.100.100.129"</span></span><br><span class="line"><span class="attr">    type:</span> <span class="string">LoadBalancer</span> <span class="comment">#change to NodePort, ClusterIP or LoadBalancer if need be</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line">      <span class="comment">## You can add custom gateway ports</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">      nodePort:</span> <span class="number">31380</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">443</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">https</span></span><br><span class="line"><span class="attr">      nodePort:</span> <span class="number">31390</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">31400</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">tcp</span></span><br><span class="line"><span class="attr">      nodePort:</span> <span class="number">31400</span></span><br><span class="line"><span class="attr">  deployment:</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      istio:</span> <span class="string">ingressgateway</span> <span class="comment">#will be added to pods and service</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line"><span class="attr">    - containerPort:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">    - containerPort:</span> <span class="number">443</span></span><br><span class="line"><span class="attr">    - containerPort:</span> <span class="number">31400</span></span><br><span class="line"><span class="attr">    secretVolumes:</span></span><br><span class="line"><span class="attr">    - name:</span> <span class="string">ingressgateway-certs</span></span><br><span class="line"><span class="attr">      secretName:</span> <span class="string">istio-ingressgateway-certs</span></span><br><span class="line"><span class="attr">      mountPath:</span> <span class="string">/etc/istio/ingressgateway-certs</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># egressgateway configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">egressgateway:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">istio-egressgateway-service-account</span></span><br><span class="line"><span class="attr">  autoscaleMin:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  autoscaleMax:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line"><span class="comment"># limits:</span></span><br><span class="line"><span class="comment">#  cpu: 100m</span></span><br><span class="line"><span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="comment"># requests:</span></span><br><span class="line"><span class="comment">#  cpu: 100m</span></span><br><span class="line"><span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">istio-egressgateway</span> <span class="comment">#DNS addressible</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      istio:</span> <span class="string">egressgateway</span></span><br><span class="line">    <span class="comment">#namespace: istio-system</span></span><br><span class="line"><span class="attr">    type:</span> <span class="string">ClusterIP</span> <span class="comment">#change to NodePort or LoadBalancer if need be</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line">      <span class="comment">## You can add custom gateway ports</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">    - port:</span> <span class="number">443</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">https</span></span><br><span class="line"><span class="attr">  deployment:</span></span><br><span class="line"><span class="attr">    labels:</span></span><br><span class="line"><span class="attr">      istio:</span> <span class="string">egressgateway</span> <span class="comment">#will be added to pods and service</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line"><span class="attr">    - containerPort:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">    - containerPort:</span> <span class="number">443</span></span><br><span class="line">  <span class="comment"># secretVolumes: TODO</span></span><br><span class="line">  <span class="comment"># - name: someName</span></span><br><span class="line">  <span class="comment">#   mountPath: somePath</span></span><br><span class="line">  <span class="comment">#   secretName: someName</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># sidecar-injector webhook configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">sidecarInjectorWebhook:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">sidecar_injector</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># galley configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">galley:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">default</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">galley</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">  <span class="comment"># limits:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line">  <span class="comment"># requests:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># mixer configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">mixer:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">default</span> <span class="comment"># used only if RBAC is not enabled</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">mixer</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">  <span class="comment"># limits:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line">  <span class="comment"># requests:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line"></span><br><span class="line"><span class="attr">  prometheusStatsdExporter:</span></span><br><span class="line"><span class="attr">    repository:</span> <span class="number">192.168</span><span class="number">.30</span><span class="number">.100</span><span class="string">:8889/prom/statsd-exporter</span></span><br><span class="line"><span class="attr">    tag:</span> <span class="string">latest</span></span><br><span class="line"><span class="attr">    resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># pilot configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">pilot:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">default</span> <span class="comment"># used only if RBAC is not enabled</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">pilot</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">  <span class="comment"># limits:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line">  <span class="comment"># requests:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># security configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">security:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  serviceAccountName:</span> <span class="string">default</span> <span class="comment"># used only if RBAC is not enabled</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">citadel</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">  <span class="comment"># limits:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line">  <span class="comment"># requests:</span></span><br><span class="line">  <span class="comment">#  cpu: 100m</span></span><br><span class="line">  <span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="attr">  cleanUpOldCA:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># addons configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="attr">grafana:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">grafana</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">    type:</span> <span class="string">ClusterIP</span></span><br><span class="line"><span class="attr">    externalPort:</span> <span class="number">3000</span></span><br><span class="line"><span class="attr">    internalPort:</span> <span class="number">3000</span></span><br><span class="line"><span class="attr">  ingress:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">false</span></span><br><span class="line">    <span class="comment"># Used to create an Ingress record.</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">grafana.local</span></span><br><span class="line"><span class="attr">    annotations:</span></span><br><span class="line">      <span class="comment"># kubernetes.io/ingress.class: nginx</span></span><br><span class="line">      <span class="comment"># kubernetes.io/tls-acme: "true"</span></span><br><span class="line"><span class="attr">    tls:</span></span><br><span class="line">      <span class="comment"># Secrets must be manually created in the namespace.</span></span><br><span class="line">      <span class="comment"># - secretName: grafana-tls</span></span><br><span class="line">      <span class="comment">#   hosts:</span></span><br><span class="line">      <span class="comment">#     - grafana.local</span></span><br><span class="line"></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">    <span class="comment"># limits:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line">    <span class="comment"># requests:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line"></span><br><span class="line"><span class="attr">prometheus:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span></span><br><span class="line"><span class="attr">    repository:</span> <span class="number">192.168</span><span class="number">.30</span><span class="number">.100</span><span class="string">:8889/prom/prometheus</span></span><br><span class="line"><span class="attr">    tag:</span> <span class="string">latest</span></span><br><span class="line"><span class="attr">  ingress:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">false</span></span><br><span class="line">    <span class="comment"># Used to create an Ingress record.</span></span><br><span class="line">    <span class="comment">#hosts:</span></span><br><span class="line">    <span class="comment">#  - prometheus.local</span></span><br><span class="line"><span class="attr">    annotations:</span></span><br><span class="line">      <span class="comment"># kubernetes.io/ingress.class: nginx</span></span><br><span class="line">      <span class="comment"># kubernetes.io/tls-acme: "true"</span></span><br><span class="line"><span class="attr">    tls:</span></span><br><span class="line">      <span class="comment"># Secrets must be manually created in the namespace.</span></span><br><span class="line">      <span class="comment"># - secretName: prometheus-tls</span></span><br><span class="line">      <span class="comment">#   hosts:</span></span><br><span class="line">      <span class="comment">#     - prometheus.local</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">    <span class="comment"># limits:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line">    <span class="comment"># requests:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    nodePort:</span></span><br><span class="line"><span class="attr">      enabled:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">      port:</span> <span class="number">32090</span></span><br><span class="line"></span><br><span class="line"><span class="attr">servicegraph:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span> <span class="string">servicegraph</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">    type:</span> <span class="string">ClusterIP</span></span><br><span class="line"><span class="attr">    externalPort:</span> <span class="number">8088</span></span><br><span class="line"><span class="attr">    internalPort:</span> <span class="number">8088</span></span><br><span class="line"><span class="attr">  ingress:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">false</span></span><br><span class="line">    <span class="comment"># Used to create an Ingress record.</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">servicegraph.local</span></span><br><span class="line"><span class="attr">    annotations:</span></span><br><span class="line">      <span class="comment"># kubernetes.io/ingress.class: nginx</span></span><br><span class="line">      <span class="comment"># kubernetes.io/tls-acme: "true"</span></span><br><span class="line"><span class="attr">    tls:</span></span><br><span class="line">      <span class="comment"># Secrets must be manually created in the namespace.</span></span><br><span class="line">      <span class="comment"># - secretName: servicegraph-tls</span></span><br><span class="line">      <span class="comment">#   hosts:</span></span><br><span class="line">      <span class="comment">#     - servicegraph.local</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">    <span class="comment"># limits:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line">    <span class="comment"># requests:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line">  <span class="comment"># prometheus addres</span></span><br><span class="line"><span class="attr">  prometheusAddr:</span> <span class="attr">http://prometheus:9090</span></span><br><span class="line"></span><br><span class="line"><span class="attr">tracing:</span></span><br><span class="line"><span class="attr">  enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">  jaeger:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">    memory:</span></span><br><span class="line"><span class="attr">      max_traces:</span> <span class="number">50000</span></span><br><span class="line"><span class="attr">  replicaCount:</span> <span class="number">1</span></span><br><span class="line"><span class="attr">  image:</span></span><br><span class="line"><span class="attr">    repository:</span> <span class="number">192.168</span><span class="number">.30</span><span class="number">.100</span><span class="string">:8889/jaegertracing/all-in-one</span></span><br><span class="line"><span class="attr">    tag:</span> <span class="number">1.5</span></span><br><span class="line"><span class="attr">  service:</span></span><br><span class="line"><span class="attr">    name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">    type:</span> <span class="string">ClusterIP</span></span><br><span class="line"><span class="attr">    externalPort:</span> <span class="number">9411</span></span><br><span class="line"><span class="attr">    internalPort:</span> <span class="number">9411</span></span><br><span class="line"><span class="attr">    uiPort:</span> <span class="number">16686</span></span><br><span class="line"><span class="attr">  ingress:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">false</span></span><br><span class="line">    <span class="comment"># Used to create an Ingress record.</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">zipkin.local</span></span><br><span class="line"><span class="attr">    annotations:</span></span><br><span class="line">      <span class="comment"># kubernetes.io/ingress.class: nginx</span></span><br><span class="line">      <span class="comment"># kubernetes.io/tls-acme: "true"</span></span><br><span class="line"><span class="attr">    tls:</span></span><br><span class="line">      <span class="comment"># Secrets must be manually created in the namespace.</span></span><br><span class="line">      <span class="comment"># - secretName: zipkin-tls</span></span><br><span class="line">      <span class="comment">#   hosts:</span></span><br><span class="line">      <span class="comment">#     - zipkin.local</span></span><br><span class="line"><span class="attr">  resources:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">    <span class="comment"># limits:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br><span class="line">    <span class="comment"># requests:</span></span><br><span class="line">    <span class="comment">#  cpu: 100m</span></span><br><span class="line">    <span class="comment">#  memory: 128Mi</span></span><br></pre></td></tr></table></figure></p><p>主要修改了镜像地址和将以些默认不安装的addon设置为安装(<code>grafana</code>,<code>servicegraph</code>,<code>tracing</code>)<br>安装成功之后<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/svc.png" alt="istio svc" title="">                </div>                <div class="image-caption">istio svc</div>            </figure><br><strong><em>为了避免ingressgate-way所在的机子80端口被占用，特申请一台ingressgate-way的IP地址相同机子</em></strong><br><br><strong><em>在dns里添加了主机域名</em></strong></p><h1 id="Mesh-Expansion"><a href="#Mesh-Expansion" class="headerlink" title="Mesh Expansion"></a>Mesh Expansion</h1><p>Istio 还支持管理非 Kubernetes 管理的应用。此时，需要在应用所在的 VM 或者物理中部署 Istio，具体步骤请参考 <a href="https://istio.io/docs/setup/kubernetes/mesh-expansion.html。" target="_blank" rel="noopener">https://istio.io/docs/setup/kubernetes/mesh-expansion.html。</a><br>部署好后，就可以向 Istio 注册应用，如<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># istioctl register servicename machine-ip portname:port</span></span><br><span class="line"><span class="string">istioctl</span> <span class="bullet">-n</span> <span class="string">onprem</span> <span class="string">register</span> <span class="string">mysql</span> <span class="number">1.2</span><span class="number">.3</span><span class="number">.4</span> <span class="number">3306</span></span><br><span class="line"><span class="string">istioctl</span> <span class="bullet">-n</span> <span class="string">onprem</span> <span class="string">register</span> <span class="string">svc1</span> <span class="number">1.2</span><span class="number">.3</span><span class="number">.4</span> <span class="attr">http:7000</span></span><br></pre></td></tr></table></figure></p><h1 id="Prometheus、Grafana-和-Zipkin"><a href="#Prometheus、Grafana-和-Zipkin" class="headerlink" title="Prometheus、Grafana 和 Zipkin"></a>Prometheus、Grafana 和 Zipkin</h1><p>等所有 Pod 启动后，可以通过 NodePort、负载均衡服务的外网 IP 或者 kubectl proxy 来访问这些服务或者创建一个istio的VirtualService。<br><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Gateway</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">istio-gateway</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  selector:</span></span><br><span class="line"><span class="attr">    istio:</span> <span class="string">ingressgateway</span> <span class="comment"># use istio default controller</span></span><br><span class="line"><span class="attr">  servers:</span></span><br><span class="line"><span class="attr">  - port:</span></span><br><span class="line"><span class="attr">      number:</span> <span class="number">80</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">http</span></span><br><span class="line"><span class="attr">      protocol:</span> <span class="string">HTTP</span></span><br><span class="line"><span class="attr">    hosts:</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"prom.example.com"</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"grafana.example.com"</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"pilot.example.com"</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">"zipkin.example.com"</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">grafana</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">"grafana.example.com"</span></span><br><span class="line"><span class="attr">  gateways:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">istio-gateway</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">grafana.istio-system.svc.cluster.local</span></span><br><span class="line"><span class="attr">        port:</span></span><br><span class="line"><span class="attr">          number:</span> <span class="number">3000</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">networking.istio.io/v1alpha3</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">VirtualService</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">prom</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"><span class="attr">  hosts:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">"prom.example.com"</span></span><br><span class="line"><span class="attr">  gateways:</span></span><br><span class="line"><span class="bullet">  -</span> <span class="string">istio-gateway</span></span><br><span class="line"><span class="attr">  http:</span></span><br><span class="line"><span class="attr">  - route:</span></span><br><span class="line"><span class="attr">    - destination:</span></span><br><span class="line"><span class="attr">        host:</span> <span class="string">prometheus.istio-system.svc.cluster.local</span></span><br><span class="line"><span class="attr">        port:</span></span><br><span class="line"><span class="attr">          number:</span> <span class="number">9090</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure></p><p>通过 <code>http://grafana.example.com</code> 访问 Grafana 服务<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/grafana.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><p>通过loabblancer访问jaeger-query,展示服务之间调用关系图<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/jaeger-query.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://istio.io/docs/setup/kubernetes/helm-install/" target="_blank" rel="noopener">官方istio安装</a><br><a href="https://kubernetes.feisky.xyz/zh/apps/istio-deploy.html" target="_blank" rel="noopener">istio安装</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;istio安装&quot;&gt;&lt;a href=&quot;#istio安装&quot; class=&quot;headerlink&quot; title=&quot;istio安装&quot;&gt;&lt;/a&gt;istio安装&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://istio.io/docs/setup/&quot; target=&quot;_bl
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
      <category term="istio" scheme="https://www.zhengyuyan.com/tags/istio/"/>
    
  </entry>
  
  <entry>
    <title>istio简介(一)</title>
    <link href="https://www.zhengyuyan.com/201807/17/istio-brief/"/>
    <id>https://www.zhengyuyan.com/201807/17/istio-brief/</id>
    <published>2018-07-17T13:17:51.000Z</published>
    <updated>2018-11-13T15:19:59.136Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Istio简介"><a href="#Istio简介" class="headerlink" title="Istio简介"></a>Istio简介</h1><h2 id="Service-Mesh"><a href="#Service-Mesh" class="headerlink" title="Service Mesh"></a>Service Mesh</h2><p>服务网格是一个基础设施层，功能在于处理服务间通信，职责是负责实现请求的可靠传递。在实践中，服务网格通常实现为轻量级网络代理，通常与应用程序部署在一起，但是对应用程序透明。</p><h2 id="Istio是什么"><a href="#Istio是什么" class="headerlink" title="Istio是什么"></a>Istio是什么</h2><p>Istio是一个服务网格.<br>Istio 是一个用来连接、管理和保护微服务的开放平台。<br>Istio 提供一种简单的方式来为已部署的服务建立网络，该网络具有负载均衡、服务间认证、监控等功能，而不需要对服务的代码做任何改动。想要让服务支持 Istio，只需要在您的环境中部署一个特殊的 sidecar，使用 Istio 控制平面功能配置和管理代理，拦截微服务之间的所有网络通信。</p><h2 id="Istio功能"><a href="#Istio功能" class="headerlink" title="Istio功能"></a>Istio功能</h2><p>Istio 提供了一个完整的解决方案，通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。它在服务网络中统一提供了许多关键功能：</p><ul><li>流量管理。控制服务之间的流量和API调用的流向，使得调用更可靠，并使网络在恶劣情况下更加健壮。</li><li>服务身份和安全。为网格中的服务提供可验证身份，并提供保护服务流量的能力，使其可以在不同可信度的网络上流转。</li><li>策略执行。将组织策略应用于服务之间的互动，确保访问策略得以执行，资源在消费者之间良好分配。可以通过通过配置网格而不是修改应用程序代码来完成策略的更改。</li><li>遥测：了解服务之间的依赖关系，以及它们之间流量的本质和流向，从而提供快速识别问题的能力。</li></ul><h2 id="Istio体系结构"><a href="#Istio体系结构" class="headerlink" title="Istio体系结构"></a>Istio体系结构</h2><p>Istio 服务网格逻辑上分为数据平面和控制平面。</p><ul><li>数据平面由一组以sidecar方式部署的智能代理（Envoy）组成。这些代理可以调节和控制微服务及 Mixer 之间所有的网络通信。</li><li>控制平面负责管理和配置代理来路由流量。此外控制平面配置 Mixer 以实施策略和收集遥测数据。</li></ul><p>Istio主要由Envoy、Pilot、Mixer三部分组成，整体结构如下：<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/arch.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><ul><li>Envoy：以sidecar的形式和应用程序运行与同一个pod中，通过修改iptables来代理应用程序的所有出入流量</li><li>Pilot：接受系统管理员发出的指令或者规则，遥控所有Envoy的行为</li><li>Mixer：从Envoy处获取流量属性，根据自定义的属性匹配规则进行流量处理，如：流量限制、日志记录等</li></ul><h3 id="Envoy"><a href="#Envoy" class="headerlink" title="Envoy"></a>Envoy</h3><p>Istio利用了Envoy的许多内置功能，例如动态服务发现，负载均衡，TLS termination，HTTP/2&amp;gRPC代理，熔断器，健康检查，基于百分比流量拆分的分段推出，故障注入和丰富的metrics。<br>Envoy实现了过滤和路由、服务发现、健康检查，提供了具有弹性的负载均衡。它在安全上支持TLS，在通信方面支持gRPC.</p><p>概括说，Envoy 提供的是服务间网络通讯的能力，包括(以下均可支持TLS)：</p><ul><li>HTTP／1.1</li><li>HTTP/2</li><li>gRPC</li><li>TCP</li></ul><p>以及网络通讯直接相关的功能：</p><ul><li>服务发现：从Pilot得到服务发现信息</li><li>过滤</li><li>负载均衡</li><li>健康检查</li><li>执行路由规则(Rule): 规则来自Polit,包括路由和目的地策略</li><li>加密和认证: TLS certs来自 istio-Auth</li></ul><h3 id="Pilot-流量管理"><a href="#Pilot-流量管理" class="headerlink" title="Pilot(流量管理)"></a>Pilot(流量管理)</h3><p>Envoy在其中扮演的负责搬砖的民工角色, 而指挥Envoy工作的民工头就是Pilot模块.<br>Pilot负责收集和验证配置并将其传播到各种Istio组件。它从Mixer和Envoy中抽取环境特定的实现细节，为他们提供独立于底层平台的用户服务的抽象表示。此外，流量管理规则（即通用4层规则和7层HTTP/gRPC路由规则）可以在运行时通过Pilot进行编程。<br>每个Envoy实例根据其从Pilot获得的信息以及其负载均衡池中的其他实例的定期健康检查来维护 负载均衡信息，从而允许其在目标实例之间智能分配流量，同时遵循其指定的路由规则。<br>Pilot负责在Istio服务网格中部署的Envoy实例的生命周期。</p><h4 id="Pilot的架构"><a href="#Pilot的架构" class="headerlink" title="Pilot的架构"></a>Pilot的架构</h4><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/PilotAdapters.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><ul><li>Envoy API负责和Envoy的通讯, 主要是发送服务发现信息和流量控制规则给Envoy</li><li>Envoy提供服务发现，负载均衡池和路由表的动态更新的API。这些API将istio和Envoy的实现解耦。(另外,也使得 Linkerd 之类的其他服务网络实现得以平滑接管Envoy)</li><li>Polit 定了一个抽象模型, 以从特定平台细节中解耦, 为跨平台提供基础.</li><li>Platform Adapter则是这个抽象模型的现实实现版本, 用于对接外部的不同平台</li><li>最后是 Rules API, 提供接口给外部调用以管理 Pilot, 包括命令行工具istioctl以及未来可能出现的第三方管理界面</li></ul><h4 id="pilot功能"><a href="#pilot功能" class="headerlink" title="pilot功能"></a>pilot功能</h4><p>基于上述的架构设计, pilot提供以下重要功能:</p><ul><li>请求路由</li><li>服务发现和负载均衡</li><li>故障处理</li><li>故障注入</li><li>规则配置</li></ul><h3 id="Mixer"><a href="#Mixer" class="headerlink" title="Mixer"></a>Mixer</h3><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/mixer-logo.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><p>Mixer负责在服务网格上执行访问控制和使用策略，并收集Envoy代理和其他服务的遥测数据。</p><h4 id="Mixer的设计背景"><a href="#Mixer的设计背景" class="headerlink" title="Mixer的设计背景"></a>Mixer的设计背景</h4><p>我们的系统通常会基于大量的基础设施而构建, 这些基础设施的后端服务为业务服务提供各种支持功能。包括访问控制系统，遥测捕获系统，配额执行系统，计费系统等。在传统设计中, 服务直接与这些后端系统集成，容易产生硬耦合.<br>在istio中,为了避免应用程序的微服务和基础设施的后端服务之间的耦合, 提供了 Mixer 作为两者的通用中介层:<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/mixer-traffic.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h4 id="Mixer的功能"><a href="#Mixer的功能" class="headerlink" title="Mixer的功能"></a>Mixer的功能</h4><p>Mixer 提供三个核心功能：</p><ul><li>前提条件检查。允许服务在响应来自服务消费者的传入请求之前验证一些前提条件。前提条件包括认证，黑白名单，ACL检查等等。</li><li>配额管理。使服务能够在多个维度上分配和释放配额。典型例子如限速。</li><li>遥测报告。使服务能够上报日志和监控。<br>在Istio内，Envoy重度依赖Mixer。</li></ul><h3 id="Istio-Auth"><a href="#Istio-Auth" class="headerlink" title="Istio-Auth"></a>Istio-Auth</h3><p>Istio-Auth提供强大的服务到服务和终端用户认证，使用交互TLS，内置身份和凭据管理。它可用于升级服务网格中的未加密流量，并为运维人员提供基于服务身份而不是网络控制实施策略的能力。</p><h4 id="auth的架构"><a href="#auth的架构" class="headerlink" title="auth的架构"></a>auth的架构</h4><p>其中包括三个组件：身份，密钥管理和通信安全。<br><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/auth.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure></p><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://istio.io/docs/concepts/what-is-istio/overview/" target="_blank" rel="noopener">istio官网</a><br><a href="https://skyao.io/publication/istio-introduction/" target="_blank" rel="noopener">服务网格新生代-Istio(敖小剑)</a><br><a href="https://blog.csdn.net/chenleiking/article/details/79785493" target="_blank" rel="noopener">istio简介</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Istio简介&quot;&gt;&lt;a href=&quot;#Istio简介&quot; class=&quot;headerlink&quot; title=&quot;Istio简介&quot;&gt;&lt;/a&gt;Istio简介&lt;/h1&gt;&lt;h2 id=&quot;Service-Mesh&quot;&gt;&lt;a href=&quot;#Service-Mesh&quot; class=&quot;
      
    
    </summary>
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/categories/service-Mesh/"/>
    
    
      <category term="service Mesh" scheme="https://www.zhengyuyan.com/tags/service-Mesh/"/>
    
      <category term="istio" scheme="https://www.zhengyuyan.com/tags/istio/"/>
    
  </entry>
  
  <entry>
    <title>etcd操作</title>
    <link href="https://www.zhengyuyan.com/201806/29/etcd%E6%93%8D%E4%BD%9C/"/>
    <id>https://www.zhengyuyan.com/201806/29/etcd操作/</id>
    <published>2018-06-29T09:22:39.000Z</published>
    <updated>2018-11-13T15:28:57.073Z</updated>
    
    <content type="html"><![CDATA[<h1 id="helm删除应用-kubernetes-dashbord上显示的相关pod还在-利用kubectl命令查询报Error-from-server-NotFound-pods-quot-istio-pilot-9b8bb4dcb-k2knj-quot-not-found"><a href="#helm删除应用-kubernetes-dashbord上显示的相关pod还在-利用kubectl命令查询报Error-from-server-NotFound-pods-quot-istio-pilot-9b8bb4dcb-k2knj-quot-not-found" class="headerlink" title="helm删除应用,kubernetes dashbord上显示的相关pod还在,利用kubectl命令查询报Error from server (NotFound): pods &quot;istio-pilot-9b8bb4dcb-k2knj&quot; not found"></a>helm删除应用,kubernetes dashbord上显示的相关pod还在,利用kubectl命令查询报<code>Error from server (NotFound): pods &quot;istio-pilot-9b8bb4dcb-k2knj&quot; not found</code></h1><p>今天利用<code>helm</code>去部署一个应用，</p><p>因为一些问题想删掉部署的应用。</p><p>利用<code>helm</code>执行了删除操作后，dashbord中有几个pod显示异常,未被删除。</p><p>用<code>kubectl</code>去查询<code>pod</code>,</p><p>查询结果显示<code>Error from server (NotFound): pods &quot;istio-pilot-9b8bb4dcb-k2knj&quot; not found</code>。</p><p><code>dashboard</code>刷新了几次 相关异常<code>pod</code>还在。</p><p>为了真正的删除资源，就操作etcd了。</p><p>连接etcd所在服务器执行<code>ectdctl --help</code>,然后执行<code>etcdctl ls</code>结果</p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/etcd_1.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><p>然后执行了<code>export ETCDCTL_API=3</code>。</p><p>然后<code>etcdctl get /registry/deployments/default --prefix --keys-only</code></p><figure class="image-bubble">                <div class="img-lightbox">                    <div class="overlay"></div>                    <img src="/img/etcd_2.png" alt="" title="">                </div>                <div class="image-caption"></div>            </figure><p>最后删除相关异常<code>pod</code></p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">etcdctl del  /registry/pods/istio-system/istio-sidecar-injector-7889c4fdf5-gnbpk</span><br><span class="line">etcdctl del  /registry/pods/istio-system/istio-pilot-db45c47d9-bzt9r</span><br><span class="line">etcdctl del  /registry/pods/istio-system/istio-sidecar-injector-645c89bc64-fh298</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;helm删除应用-kubernetes-dashbord上显示的相关pod还在-利用kubectl命令查询报Error-from-server-NotFound-pods-quot-istio-pilot-9b8bb4dcb-k2knj-quot-not-foun
      
    
    </summary>
    
      <category term="Trouble" scheme="https://www.zhengyuyan.com/categories/Trouble/"/>
    
    
      <category term="etcd" scheme="https://www.zhengyuyan.com/tags/etcd/"/>
    
  </entry>
  
</feed>
