Kubernetes內部域名解析的那些事兒

前言

    在kubernets環境中,服務發現大都是基於內部域名的方式。那麼就涉及到內部域名的解析。從1.11版本開始,kubeadm已經使用第三方的CoreDNS替換官方的kubedns作為集群內部域名的解析組件。

kubernets中的4種DNS策略

None

表示空的DNS設置,這種方式一般用於想要自定義 DNS 配置的場景,往往需要和 dnsConfig 配合一起使用達到自定義 DNS 的目的。

Default

此種方式是讓kubelet來決定使用何種DNS策略。而kubelet默認的方式,就是使用宿主機的/etc/resolv.conf文件。

同時,kubelet也可以配置指定的DNS策略文件,使用kubelet參數即可,如:–resolv-conf=/etc/resolv.conf

ClusterFirst

此種方式是使用kubernets集群內部中的kubedns或coredns服務進行域名解析。若解析不成功,才會使用宿主機的DNS配置來進行解析。

ClusterFistWithHostNet

在某些場景下,我們的 POD 是用 HOST 模式啟動的(HOST模式,是共享宿主機網絡的),一旦用 HOST 模式,表示這個 POD 中的所有容器,都要使用宿主機的 /etc/resolv.conf 配置進行DNS查詢,但如果你想使用了 HOST 模式,還繼續使用 Kubernetes 的DNS服務,那就將 dnsPolicy 設置為 ClusterFirstWithHostNet。

策略配置示例

DNS策略,需要在Pod,或者Deployment、RC等資源中,設置 dnsPolicy 即可,以 Pod 為例:

apiVersion: v1
kind: Pod
metadata:
   labels:
    name: cadvisor-nodexxxx
    hostip: 192.168.x.x
  name: cadvisor-nodexxxx
  namespace: monitoring
spec:
  containers:
  - args:
    - --profiling
    - --housekeeping_interval=10s
    - --storage_duration=1m0s
    image: google/cadvisor:latest
    name: cadvisor-nodexxxx
    ports:
    - containerPort: 8080
      name: http
      protocol: TCP
    resources: {}
    securityContext:
      privileged: true
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
  dnsPolicy: ClusterFirst
  nodeName: nodexxxx

kubernets中域名解析流程

# Pod中的resolv.conf的解析配置

[root@l-k8s01 ~]# kubectl exec -it nginx-deploy-5754944d6c-dtzpj cat /etc/resolv.conf

nameserver 10.96.0.2
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@l-k8s01 ~]# kubectl get svc -n kube-system |grep dns

kube-dns   ClusterIP  10.96.0.2   <none>   53/UDP,53/TCP,9153/TCP   158d

a)文件中配置的 nameserver 一般是k8s集群內部的dns服務的ClusterIP,無法ping,但是可以訪問。

b)意味着集群Pod內部的所有域名的解析,都要經過kubedns的虛擬ip 10.96.0.2 進行解析。

c)resolv.conf中search域分別是default.svc.cluster.local svc.cluster.local cluster.local,在kubernets中,域名的全稱必須是 service-name.namespace.svc.cluster.local 。

d)假如集群中有一個svc(Service)名為a,在某個Pod中執行命令 curl a 時,在此Pod中會根據/etc/resolv.conf進行解析流程。選擇nameserver 10.96.0.2進行解析,將字符串’a’帶入到/etc/resolv.conf文件中不同的search域,依次進行查找,如下:

a.default.svc.cluster.local -> a.svc.cluster.local -> a.cluster.local

先查找 a.default.svc.cluster.local ,若找不到,則再查找 a.svc.cluster.local ,依次往下進行,直到找到為止。

curl效率分析

在集群中若存在一個名為a的svc,在Pod中curl a和curl a.default都能實現請求,那麼兩種方式哪個的效率高呢?

那肯定是curl a啦,因為發起此請求時,通過/etc/resolv.conf中第一列的search域就能直接找到 a.default.svc.cluster.local ,直接避免了下一級的查找。

容器中訪問外部域名講述

下文將通過示例說明Pod訪問外部域名時發起的相應的請求信息。

以請求baidu.com為例,因為DNS容器一般不具備bash,所以無法通過docker exec的方式進入容器抓包,所以此處採用 進入到DNS容器的網絡中(不是發起DNS請求的容器)的姿勢去抓包,抓包姿勢準備好后,同時在某容器中訪問baidu.com,即可看到在進行的DNS查找的過程中都產生了什麼樣的數據包。

 

### 實操

# 進入dns容器網絡,準備好抓包姿勢

# 查看Pod所在具體的node節點

[root@master1 ~]# kubectl get pods -n kube-system -o wide|grep dns

coredns-5c48579f88-8wprg  1/1   Running  16    30d   10.244.4.120   node1
coredns-5c48579f88-rsnpr   1/1   Running   0     30d   10.244.5.142   node2

# 這裏以node1上的容器為操作對象,所以到node1節點上進行操作

# 找到容器並打印對應的NS ID

[root@node1 ~]# docker ps |grep dns

a964bbb43534 c0f6e815079e "/coredns -conf /etc…" 2 days ago Up 2 days k8s_coredns_coredns-5c48579f88-8wprg_kube-system_b1e7f3c3-98eb-4843-b156-1d203f98bd74_16
fbd12d2f9c7c k8s.gcr.io/pause:3.1 "/pause" 5 days ago Up 5 days k8s_POD_coredns-5c48579f88-8wprg_kube-system_b1e7f3c3-98eb-4843-b156-1d203f98bd74_3

[root@node1 ~]# docker inspect –format “{{.State.Pid}}”  a964bbb43534

21617

# 進入此容器的網絡Namespace

[root@node1 ~]# nsenter -n -t 21617

# 抓包姿勢就緒

[root@node1 ~]# tcpdump -i eth0 udp dst port 53|grep ‘baidu.com’

 

# 在另外的某容器中,進行域名查找操作

說明:一般pod中沒有nslookup命令,故需要手動安裝,根據不同環境自選以下操作。

### Centos

]# cat /etc/redhat-release

CentOS Linux release 7.5.1804 (Core)

]# yum -y install bind-utils

### Debian

# cat /etc/issue

Debian GNU/Linux 9

# apt-get install dnsutils -y

root@jenkins-7d66bf7977-cm4x4:~# nslookup baidu.com 10.244.4.120

 

注意:10.244.4.120是node1上的dns pod在kubernets集群中的內部通信ip地址。因為環境中有兩個dns pod,將其指定要單個具體的容器,能夠使抓包數據完整。

 

# 隨後,在前面就緒的抓包姿勢窗口就能看到數據包的出現

[root@node1 ~]# tcpdump -i eth0 udp dst port 53|grep ‘baidu.com’

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:57:50.791154 IP 10.244.4.127.51794 > node1.domain: 55406+ A? baidu.com.infra.svc.cluster.local. (51)
16:57:50.792540 IP 10.244.4.127.56306 > node1.domain: 27958+ A? baidu.com.svc.cluster.local. (45)
16:57:50.793439 IP 10.244.4.127.59799 > node1.domain: 27048+ A? baidu.com.cluster.local. (41)
16:57:50.799463 IP 10.244.4.127.39116 > node1.domain: 2303+ A? baidu.com. (27)

說明:

a)數據包中显示的 infra 是執行nslookup的pod的NameSpace;

b)根據數據显示,在真正解析到 baidu.com 之前,經歷了baidu.com.infra.svc.cluster.local. > baidu.com.svc.cluster.local. > baidu.com.cluster.local. 三次DNS請求。

請求浪費的原因

上文在正確請求到baidu.com之前,有過三次無效請求,即意味着請求浪費,那為什麼會出現那種情況呢,請繼續往下看。

 

# Pod中的resolv.conf的解析配置

root@jenkins-7d66bf7977-cm4x4:/# cat /etc/resolv.conf
nameserver 10.96.0.2
search infra.svc.cluster.local svc.cluster.local cluster.local host.com
options ndots:5

 

# options ndots:5 解釋

如果查詢的域名包含的點”.”,不到5個,那麼進行DNS查找,將使用非完全限定名稱(或者叫絕對域名),如果你查詢的域名包含點數大於等於5,那麼DNS查詢,默認會使用絕對域名進行查詢。

如果我們請求的域名是,a.b.c.d.e,這個域名中有4個點,那麼容器中進行DNS請求時,會使用非絕對域名進行查找,使用非絕對域名,會按照 /etc/resolv.conf 中的 search 域,走一遍追加匹配:

a.b.c.d.e.cicd.svc.cluster.local. ->

a.b.c.d.e.svc.cluster.local. ->

a.b.c.d.e.cluster.local.

直到找到為止。如果走完了search域還找不到,則使用 a.b.c.d.e. ,作為絕對域名進行DNS查找。

 

說明:

a)請求域名中點數少於5個時,先走search域,最後將其視為絕對域名進行查詢;

b)請求域名中點數大於等於5個時,直接視為絕對域名進行查找,只有當查詢不到的時候,才繼續走 search 域。

優化請求浪費

使用全限定域名

當訪問某域名時,以 ‘.’ 為後綴,即使用 完全限定域名(絕對域名),這樣發起的域名請求時將不會走search域進行匹配,而是直接使用整個原始域名字符串為個體進行解析。

 

如:

nslookup baidu.com.

配置特定ndots

在kubernets中,ndots值默認是5。是因為,Kubernetes 認為,內部域名,最長為5,要保證內部域名的請求,優先走集群內部的DNS,而不是將內部域名的DNS解析請求,有打到外網的機會,Kubernetes 設置 ndots 為5是一個比較合理的行為。

如果有特定業務需求,也可配置ndots,如下:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsConfig:
    options:
      - name: ndots
        value: "1"

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

網頁設計最專業,超強功能平台可客製化

DevOps系列——Jenkins/Gitlab自動打包部署

前面只說了DevOps的兩個基礎組件Jenkins和GitLab,客官也不要着急,我們玩就玩的深入一點,Gitlab和Jenkins的各種配置和

插件很多,也夠啃一陣子的,不要照着操作一通就感覺萬事大吉了,多做些邊緣測試,多玩點不一樣的操作,那今天我們來點

實戰整合加強訓練。

作者原創文章,謝絕一切轉載,違者必究!

本文只發表在”公眾號”和”博客園”,其他均屬複製粘貼!如果覺得排版不清晰,請查看公眾號文章。 

準備:

VMwareWorkstation15Pro/RHEL8.0/Jenkins2.222.3/Gitlab-ee-13.0.0

難度: 新手–戰士–老兵–大師

說明:

為了遇見各種問題,同時保持時效性,我盡量使用最新的軟件版本。源碼地址,其中的day30:https://github.com/xiexiaobiao/dubbo-project

目標:

  1. window主機提交代碼到Gitlab主機,Jenkins自動完成jar打包,併發布到Gitlab主機(可為任意主機)上運行。

1 架構

整體部署架構:

2 環境

2.1開發Java應用,一個極簡的服務,可打包為jar運行:

package com.biao.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class AppMain {
    public static void main(String[] args) {
        SpringApplication.run(AppMain.class,args);
        System.out.println("AppMain app started >>>>>>>>>>>>");
    }

    @RequestMapping("/jenkins/{name}")
    public String hello(@PathVariable(name = "name") String name){
        System.out.println("Variable: "+ name);
        return "hello, " + name;
    }
}
 

運行測試,GET http://localhost:8081/jenkins/biao 輸出:hello, biao

2.2 GitLab主機上建立一個項目,操作步驟,略!注意看下項目的兩個git地址,显示的端口號是Gitlab的端口號,不是Nginx的:

2.3 配置Jenkins主機到Gitlab主機的SSH,(配置window到Gitlab主機的SSH,也是一樣,window在CMD 下執行):

[root@server224 docker-deploy]#ssh-keygen #生成密鑰對
[root@server224 docker-deploy]#ssh-copy-id root@192.168.2.226 #發送公鑰

Window下使用git測試ssh安裝:

2.4 Jenkins主機上測試使用SSH協議連接GitLab,這樣Git可以免密連接,並使用SSH連接執行shell,

進入新建的空白目錄 /usr/hellojenkins 下:

[root@server224 hellojenkins]# ssh -T git@192.168.2.226  #測試ssh
[root@server224 hellojenkins]# git init  #初始化本地git庫,否則報錯not a git repository
[root@server224 hellojenkins]# git remote –v  # -verbose查看遠程gitlab url
[root@server224 hellojenkins]# git remote add origin git@192.168.2.226:biao/hellojenkins.git
[root@server224 hellojenkins]# git pull origin master

如下,可見連接成功,其他git操作客官請隨意:

2.5 Jenkins主機上測試使用HTTP協議連接GitLab,在 /usr/hellojenkins 下:

[root@server224 hellojenkins]# rm -rf ./* #清空hellojenkins目錄,.git和 .idea也要刪除
[root@server224 hellojenkins]# git init 
[root@server224 hellojenkins]# git remote -v
[root@server224 hellojenkins]# git remote add origin http://192.168.2.226:9099/biao/hellojenkins.git  #注意url,不是gitlabUI中給的項目url,因有Nginx代理
[root@server224 hellojenkins]# git pull origin master

如下,可見http連接成功,其他git操作客官請隨意

特別注意:如開啟了Nginx代理,會導致gitlab UI中給的項目url (見圖1),在git中無法使用,應使用Nginx的端口號!

2.6 訪問JenkinsUI,添加 ”Publish Over SSH” 插件(見前文:Jenkins安裝),並在 ”系統管理-系統配置” 添加SSH目標主機 (比如我這是192.168.2.226):

要點: 1.SSH主機登錄密碼和私鑰key,可以二選一,推薦使用私鑰key,這樣可以使用相同的私鑰key登錄多個目標主機。

2.使用私鑰key測試不通過,可能是格式問題,見後文問題部分。

3.RemoteDirectory為SSH連接后要訪問的目錄 4.Test必須显示為Success才算配置成功

2.7 其他工具配置:Jenkins主機需先安裝好Maven,Git,JDK,略!並在 “系統管理—>全局工具配置”中做對應的配置:

3 任務構建

3.1 我們來個Jenkins自動構建的實驗:新建一個任務,選擇”構建一個自由風格的軟件項目”:

General中我全空,懶得寫了。

源碼管理使用Git,(也可使用Subversion,需對應的插件),並選擇前面配置好的”憑證”:

自動構建觸發的條件是 push 事件:

構建前清空工作目錄:

構建時執行的shell腳本,source /etc/profile 不能省,可能導致mvn命令無法識別,cd $JENKINS_HOME/workspace/hellojenkins,使用環境變量來進入工作目錄,

也可使用 $WORKSPACE/hellojenkins 效果一樣,有個環境變量列錶鏈接,可供參考;mvn clean package 即 maven 編譯打包命令,內存不足的話可先只測試 mvn clean

構建后操作:1 source files是待發送的源文件,這裏特別注意要寫相對路徑target/*.jar,不是絕對路徑/var/lib/jenkins/workspace/hellojenkins/target/*.jar

2 remove prefix是需要去掉的前綴,置空則將文件和路徑一起發送,並在遠程主機建立對應目錄結構;

3 remote directory是遠程主機的目錄,發送的文件將保存至此;

4 執行的shell腳本,會在文件發送后執行,先可直接簡化為如下建立一個日期文件(最常見的是停止舊jar的運行,並運行新的jar,完整版見後面的腳本);如果需要文件發送前執行,可以添加兩個”構建后操作”,並將shell腳本執行放前,文件transfer放后:

附,完整Exec comand腳本:

#!/bin/bash
pid=$(ps -ef | grep HelloJenkins-1.0-SNAPSHOT | grep 'java' | grep -v grep | awk '{print $2'})
if [ -z "$pid" ]; then
    echo 'there are no HelloJenkins process. starting will be continue.'
fi
if [ -n "$pid" ]; then
    echo 'java process id is '$pid
    if ps -p $pid > /dev/null
    then
        echo $pid' will be kill'
        kill -9 $pid
    fi
fi
echo 'start HelloJenkins wait.'
nohup java -jar HelloJenkins-1.0-SNAPSHOT.jar  > /dev/null 2>error.log &
echo 'finish starting HelloJenkins'
 

3.2 進行 ”立即構建” 測試:

3.3 等待構建完畢查看控制台日誌,或左側”構建執行狀態”查看正在進行的Job:

控制台內容:

以上步驟解析:1 Jenkins生成對應的工作目錄,注意 /var/lib/jenkins 對應 JENKINS_HOME 變量,即Jenkins家目錄;

2對應配置選項Delete workspace before build starts,構建前刪除; 3使用SSH連接遠程Gitlab代碼庫; 4 Git操作完畢后的消息,可用於記錄本次構建;

5可以看到Jenkins將構建的配置和構建流程共同生成了一個臨時的Shell腳本,然後執行,這也是Jenkins的工作原理之一。

 

總結:這裏的Jenkins自動構建流程是使用Git從遠程庫clone到本地,然後本地構建,同時部分流程和配置會組合生成一個臨時的Shell腳本來執行,

最終完成整個構建工作流程。(Jenkins還有其他構建方式)。

 

以上步驟解析:1對應執行”構建”配置中shell命令mvn clean package的結果; 2-5是對應”構建后操作” 中的配置,其中2是開始SSH連接,

3是開始執行”Exec command”中的shell命令,4斷開SSH連接,5文件傳輸的結果

以下為server226上對應”構建后操作”中的結果,生成的文件和傳輸過來的jar包:

4 題外話

4.1 我上傳的代碼中還包含了 Dockerfile 和自動打包/部署Docker鏡像的shell腳本,內容太多,各位看官可以嘗試一下:使用Jenkins自動構建

並生成鏡像和部署運行,有空我就後期再說吧,一次寫太多看的也累。

4.2 Gitlab的WebHook功能:在Gitlab收到push事件后,可以 POST 發送定製的信息至指定的URL,從而觸發更新。比如SpringCloud的config

配置自動更新,當GitHub上的配置文件更新后,WebHook自動觸發Refresh 到Config Server 上,而完成配置自動刷新。

5 問題

5.1 添加SSH服務器時,test失敗,提示:

Failed to connect or change directory jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@d8d395a]

這是因為私鑰格式Jenkins無法識別,如果打開私鑰文件,”—–BEGIN OPENSSH PRIVATE KEY—–” 表示使用的是最新的OpenSSH格式,需要使用舊版格式,重新生成密鑰,命令如下:

ssh-keygen -t rsa -b 4096 -m PEM

再打開私鑰文件,可見私鑰文件內容開頭:”—–BEGIN RSA PRIVATE KEY—–”,

5.2 運行自動生成鏡像腳本錯誤提示$'\r' command not found

這種錯誤是因為編寫的 shell腳本是在window下編寫的,每行結尾是 \r\n,而 Unix 結束行是 \n , 所以在Linux下運行腳本會認為 \r 是一個字符,需要把文件轉換下:

[root@server224 docker-deploy]# sed -i 's/\r//' auto-image.sh

5.3 錯誤提示:Does not have a commit checked out,這是因為當前目錄下存在沒有提交的目錄,首先使用 pwd (present working directory)命令查看當前目錄,

需保持 .init命令和 pwd 命令目錄一致:

5.4 提示 http/https協議不支持,可能原因是url錯誤,或者沒添加遠程地址,初始化沒完成,即git remote add命令:

5.5 打包編譯時,內存不足,看控制台輸出,我將Jenkins主機由6G調整為8G才解決,還好我的小電腦內存足夠大:

總結:控制台輸出是個非常有用的記錄,比如我之前的構建失敗記錄,可以看到無法識別 mvn 命令,於是知道是maven未配置好!

全文完!

我近期其他文章:

  • 1 DevOps系列——Jenkins私服
  • 2 DevOps系列——Gitlab私服
  • 3 聊聊算法——滑動窗口
  • 4 聊聊算法——回溯算法
  • 5 Redis高級應用

只寫原創,敬請關注

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計最專業,超強功能平台可客製化

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家公司費用怎麼算?

RocketMQ系列(三)消息的生產與消費

前面的章節,我們已經把RocketMQ的環境搭建起來了,是一個兩主兩從的異步集群。接下來,我們就看看怎麼去使用RocketMQ,在使用之前,先要在NameServer中創建Topic,我們知道RocketMQ是基於Topic的消息隊列,在生產者發送消息的時候,要指定消息的Topic,這個Topic的路由規則是怎樣的,這些都要在NameServer中去創建。

Topic的創建

我們先看看Topic的命令是如何使用的,如下:

./bin/mqadmin updateTopic -h

usage: mqadmin updateTopic -b <arg> | -c <arg>  [-h] [-n <arg>] [-o <arg>] [-p <arg>] [-r <arg>] [-s <arg>] -t
       <arg> [-u <arg>] [-w <arg>]
 -b,--brokerAddr <arg>       create topic to which broker
 -c,--clusterName <arg>      create topic to which cluster
 -h,--help                   Print help
 -n,--namesrvAddr <arg>      Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
 -o,--order <arg>            set topic's order(true|false)
 -p,--perm <arg>             set topic's permission(2|4|6), intro[2:W 4:R; 6:RW]
 -r,--readQueueNums <arg>    set read queue nums
 -s,--hasUnitSub <arg>       has unit sub (true|false)
 -t,--topic <arg>            topic name
 -u,--unit <arg>             is unit topic (true|false)
 -w,--writeQueueNums <arg>   set write queue nums

其中有一段,-b <arg> | -c <arg>,說明這個Topic可以指定集群,也可以指定隊列,我們先創建一個Topic指定集群,因為集群中有兩個隊列broker-abroker-b,看看我們的消息是否在兩個隊列中負載;然後再創建一個Topic指向broker-a,再看看這個Topic的消息是不是只在broker-a中。

創建兩個Topic,

./bin/mqadmin updateTopic -c 'RocketMQ-Cluster' -t cluster-topic -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876'

./bin/mqadmin updateTopic -b 192.168.73.130:10911 -t broker-a-topic

第一個命令創建了一個集群的Topic,叫做cluster-topic;第二個命令創建了一個只在broker-a中才有的Topic,我們指定了-b 192.168.73.130:10911,這個是broker-a的地址和端口。

生產者發送消息

我們新建SpringBoot項目,然後引入RocketMQ的jar包,

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.3.0</version>
</dependency>

然後配置一下生產者的客戶端,在這裏使用@Configuration這個註解,具體如下:

@Configuration
public class RocketMQConfig {

    @Bean(initMethod = "start",destroyMethod = "shutdown")
    public DefaultMQProducer producer() {
        DefaultMQProducer producer = new
                DefaultMQProducer("DefaultMQProducer");
											producer.setNamesrvAddr("192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;");
        return producer;
    }
}
  • 首先創建一個生產者組,名字叫做DefaultMQProducer;
  • 然後指定NameServer,192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;
  • 最後在@Bean註解中指定初始化的方法,和銷毀的方法;

這樣,生產者的客戶端就配置好了,然後再寫個Test類,在Test類中向MQ中發送消息,如下,

@SpringBootTest
class RocketmqDemoApplicationTests {

    @Autowired
    public DefaultMQProducer defaultMQProducer;

    @Test
    public void producerTest() throws Exception {

        for (int i = 0;i<5;i++) {
            Message message = new Message();
            message.setTopic("cluster-topic");
            message.setKeys("key-"+i);
            message.setBody(("this is simpleMQ,my NO is "+i).getBytes());

            SendResult sendResult = defaultMQProducer.send(message);
            System.out.println("SendStatus:" + sendResult.getSendStatus());
            System.out.println("BrokerName:" + sendResult.getMessageQueue().getBrokerName());
        }
    }
}
  • 我們先自動注入前面配置DefaultMQProducer;
  • 然後在Test方法中,循環5次,發送5個消息,消息的Topic指定為cluster-topic,是集群的消息,然後再設置消息的key和內容,最後調用send方法發送消息,這個send方法是同步方法,程序運行到這裡會阻塞,等待返回的結果;
  • 最後,我們打印出返回的結果和broker的名字;

運行一下,看看結果:

SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-a

5個消息發送都是成功的,而發送的隊列有4個是broker-b,1個broker-a,說明兩個broker之間還是有負載的,負載的規則我們猜測是隨機。

我們再寫個測試方法,看看broker-a-topic這個Topic的發送結果是什麼樣子的,如下:

@Test
public void brokerTopicTest() throws Exception {

    for (int i = 0;i<5;i++) {
        Message message = new Message();
        message.setTopic("broker-a-topic");
        message.setKeys("key-"+i);
        message.setBody(("this is broker-a-topic's MQ,my NO is "+i).getBytes());

        defaultMQProducer.send(message, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("SendStatus:" + sendResult.getSendStatus());
                System.out.println("BrokerName:" + sendResult.getMessageQueue().getBrokerName());
            }

            @Override
            public void onException(Throwable e) {
                e.printStackTrace();
            }
        });

        System.out.println("異步發送 i="+i);

    }
}
  • 消息的Topic指定的是broker-a-topic,這個Topic我們只指定了broker-a這個隊列;
  • 發送的時候我們使用的是異步發送,程序到這裏不會阻塞,而是繼續向下執行,發送的結果正常或者異常,會調用對應的onSuccess和onException方法;
  • 我們在onSuccess方法中,打印出發送的結果和隊列的名稱;

運行一下,看看結果:

異步發送 i=0
異步發送 i=1
異步發送 i=2
異步發送 i=3
異步發送 i=4
SendStatus:SEND_OK
SendStatus:SEND_OK
SendStatus:SEND_OK
SendStatus:SEND_OK
BrokerName:broker-a
SendStatus:SEND_OK
BrokerName:broker-a
BrokerName:broker-a
BrokerName:broker-a
BrokerName:broker-a

由於我們是異步發送,所以最後的日誌先打印了出來,然後打印出返回的結果,都是發送成功的,並且隊列都是broker-a,完全符合我們的預期。

消費者

生產的消息已經發送到了隊列當中,再來看看消費者端如何消費這個消息,我們在這個配置類中配置消費者,如下:

@Bean(initMethod = "start",destroyMethod = "shutdown")
public DefaultMQPushConsumer pushConsumer() throws MQClientException {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("DefaultMQPushConsumer");
    consumer.setNamesrvAddr("192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;");
    consumer.subscribe("cluster-topic","*");
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            if (msgs!=null&&msgs.size()>0) {
                for (MessageExt msg : msgs) {
                    System.out.println(new String(msg.getBody()));
                    System.out.println(context.getMessageQueue().getBrokerName());
                }
            }

            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    } );
    return consumer;
}
  • 我們創建了一個消費者組,名字叫做DefaultMQPushConsumer;
  • 然後指定NameServer集群,192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;
  • 消費者訂閱的Topic,這裏我們訂閱的是cluster-topic,後面的*號是對應的tag,代表我們訂閱所有的tag;
  • 最後註冊一個併發執行的消息監聽器,實現裡邊的consumeMessage方法,在方法中,我們打印出消息體的內容,和消息所在的隊列;
  • 如果消息消費成功,返回CONSUME_SUCCESS,如果出現異常等情況,我們要返回RECONSUME_LATER,說明這個消息還要再次消費;

好了,這個訂閱了cluster-topic的消費者,配置完了,我們啟動一下項目,看看消費的結果如何,

this is simpleMQ,my NO is 2
broker-b
this is simpleMQ,my NO is 3
broker-b
this is simpleMQ,my NO is 1
broker-b
this is simpleMQ,my NO is 0
broker-a
this is simpleMQ,my NO is 4
broker-b

結果符合預期,cluster-topic中的5個消息全部消費成功,而且隊列是4個broker-b,1個broker-a,和發送時的結果是一致的。

大家有問題歡迎評論區討論~

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※回頭車貨運收費標準

※推薦評價好的iphone維修中心

※超省錢租車方案

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

※推薦台中搬家公司優質服務,可到府估價

「MoreThanJava」Java發展史及起航新世界

  • 「MoreThanJava」 宣揚的是 「學習,不止 CODE」,本系列 Java 基礎教程是自己在結合各方面的知識之後,對 Java 基礎的一個總回顧,旨在 「幫助新朋友快速高質量的學習」
  • 當然 不論新老朋友 我相信您都可以 從中獲益。如果覺得 「不錯」 的朋友,歡迎 「關注 + 留言 + 分享」,文末有完整的獲取鏈接,您的支持是我前進的最大的動力!

Part 1. Java 發展簡史

  • 圖片來源:https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language/

起源:”Green” 項目

20 世紀 90 年代,單片式計算機系統誕生,單片式計算機系統不僅廉價,而且功能強大,使用它可以大幅度提升消費性电子產品的智能化程度。

SUN 公司為了搶佔市場先機,在 1991 年成立了一個由詹姆斯·高斯林(James Gosling)領導,名為 “Green” 項目小組,目的是開發一種 能夠在各種消費性电子產品上運行的程序架構(主要是像 有線電視轉換盒 這一類 處理能力和內存都很有限,並且 CPU 廠商又各不相同 的消費設備)。

由於這些消費設備的處理能力和內存都有限,所以語言必須 非常小且能夠生成非常緊湊的代碼。另外,由於不同廠商會選擇不同的 CPU,因此很重要的一點是這種語言 不應該與任何特定的體繫結構綁定。代碼短小、緊湊且與平台無關,這些要求促使開發團隊設計出一個 可移植的語言,可以為虛擬機生成中間代碼。

不過,Sun 公司的人都有 UNIX 的應用背景。因此,所開發的語言以 C++ 為基礎,而不是 Lisp/ Smalltalk 或 Pascal。不過,就像 Gosling 在專訪中談道:“畢竟,語言只是實現目標的工具,而不是目標本身。”

Gosling 把這種語言稱為 “Oak”(直譯為橡樹,大概是因為它非常喜歡自己辦公室窗外的一顆橡樹…)。後來 Sun 公司發現,Oak 是一種已有的計算機語言名字,於是 Gosling 和他的團隊進行了一次頭腦風暴,多次討論后,從 Java/ DNA/ SILK/ RUBY 中決定使用 Java 來命名。事實證明這是一個很有靈感的選擇。

埋沒:沒人為 “Green” 項目買單

1992 年,Green 項目發布了它的第一個產品,稱之為 「* 7」。這個產品可以提供非常智能的遠程控制。遺憾的是,Sun 公司對生產這個產品並不感興趣。Green 項目組的人員必須找出其他的方法來講他們的技術推向市場。

然而,仍然沒有任何一家標準消費品电子公司對此感興趣。於是,Green 項目組投標了一個設計有線電視盒的項目,它能提供視頻點播等新型有線服務,但他們沒能拿到這個合同 (有趣的是,得到這個項目的公司的領導恰恰是開闢 Netscape 公司的 Jim Clark。Netscape 公司後來對 Java 的成功給予了很大的幫助。)

Green 項目 (這時已經換了一個新名字 ———— “First Person 公司”)1993 年一整年以及 1994 年上半年,一直在苦苦尋找買家購買他們的技術。然而,一個也沒有找到 (Partick Naughton ———— 項目組的創始人之一,也是完成了大多數營銷工作的人,聲稱為了銷售這項技術,已累計飛行了 300,000 英里)

1994 年 First Person 公司解散了。

轉機:Internet 的壯大

當這一切在 Sun 公司發生的時候,Internet 的萬維網也在日漸發展壯大。萬維網的關鍵是把超文本頁面轉換到屏幕上的瀏覽器。

1994 年大多數人都在使用 Mosaic,這是一個 1993 年出自伊利諾斯大學超級計算中心的非商業化的 Web 瀏覽器( Mosaic 的一部分是由 Marc Andreessen 編寫的。當時,他作為一名參加半工半讀項目的本科生, 編寫了這個軟件,每小時的薪水只有 6.85 美元。他後來成了 Netscape 公司的創始人之一和技術總監, 可謂名利雙收。)

在接受 SunWorld 採訪的時候,Gosling 說在 1994 年中期,Java 語言的開發者意識到: “我們能夠建立一個相當酷的瀏覽器。在客戶機/ 服務器主流模型中,瀏覽器恰好需要我們已經完成的一些工作:體繫結構中立、實時、可靠、安全 ———— 這些在工作站環境並不太重要,所以,我們決定開發瀏覽器”

實際的瀏覽器是由 Patrick Naughton 和 Jonathan Payne 開發的,並演變為 HotJava 瀏覽器。為了炫耀 Java 語言超強的能力,HotJava 瀏覽器採用 Java 編寫。設計者讓 HotJava 瀏覽器具有在網頁中執行內嵌代碼的能力。 這一 “技術證明” 在 1995523 日的 SunWorld’95 上得到展示,同時引發了人們延續至今的對 Java 的狂熱追逐。

至此,這一場持續長達 20 多年的「Java 熱」開始了。

  • 觀察近 20 年的數據,Java 的排名從未跌出過前三,而且有將近一半的年份搶佔了透明,不得不令人感嘆:「流水的程序員,鐵打的 Java 啊!」

Part 2. Java 與 Internet

  • 圖片來源:https://www.morethanshipping.com/internet-things-iot-will-help-logistics/

如果 Java 僅僅只是眾多的程序設計語言中的一種,你可能就會問:為什麼它如此重要呢?為什麼它促使計算機編程語言向前邁進了革命性的一步?

如果從傳統的程序設計的角度看,問題的答案似乎不太明顯。儘管 Java 對於解決傳統的單機程序設計問題非常有用,但同樣重要的事,它解決了在萬維網(WWW)上的程序設計問題

Web 1.0 時代的程序設計問題

在剛創造 Java 的年代(20 世紀 90 年代),整個互聯網還處於 Web 1.0 的網絡萌芽階段。

在 之前的一篇文章 其實有對 Web 做了一些概念性的描述(概念、發展、體繫結構)。

問題一:網頁沒有交互

Web 1.0 的網站是靜態的。最初的互聯網只有一種很簡單的 單向過程:你 對某一個服務器發起一個請求,然後它 返回 給你一個 文件,你的機器(俗稱客戶端)上的 瀏覽器軟件 根據本地機器的格式來 解讀並展示 這個文件的內容。這期間沒有任何的交互發生,因為最初的瀏覽器只是一個 “展示器”,它甚至不能執行最簡單的計算任務。(另一方面,它確是安全的,因為它在你的本地機器上不會執行任何程序,而這些程序可能包含 bug 和病毒)

用戶 只能訪問 這些站點而不會對它們做出任何貢獻。這就像你捧起書架中的一本書一樣,它是一種 「只讀」 模式的存在,如果你想與創造這本書的出版社也好,作者也好建立鏈接,只能通過其他的一些方式。(當時的網站也是主要是向消費者展示產品,從感興趣的消費者那裡收錢)

很快人們就不滿足於只是從服務器傳遞迴頁面,人們希望實現完整的客戶/ 服務器能力,使得客戶可以將信息反饋給服務器,來完成例如:在服務器上進行數據查找,並將用戶提供的新信息加到服務器中,服務器管理人員接受到新信息之後就下發訂單的操作。

問題二:響應緩慢

早期的瀏覽器不僅沒有交互,而且它還趨向於讓服務器和 Internet 阻塞。因為在任何時候,只要 你需要完成 通過編程 才能實現的 任務,就必須將信息發揮到 服務器處理。然而在互聯網中,在任意時刻都有可能會有 成百上千 的客戶向服務器發出請求,所以任何小的延遲都會產生重大的影響。

為了解決這個問題,人們採用了各種不同的方法。首先,圖形標準得到了加強,這使得在瀏覽器中可以播放質量更好的動畫和視頻。剩下的問題通過引入 在客戶端瀏覽器中運行程序 的能力就可以解決,這被稱為 「客戶端編程」

問題三:客戶端編程平台各異

大多數運行 Web 瀏覽器的機器都是能夠執行大型任務的強有力的引擎。在使用原始的靜態 HTML 方式的情況下,它們通常只是閑在那裡,等着服務器送來下一個頁面。

客戶端編程意味着 Web 瀏覽器能夠用來執行任何它可以完成的工作,使得返回給用戶的結果 更迅速 (不用全部的結果都等着服務器來運算),而且使得你的網站 更加具有交互性 (那些不需要使用服務器數據的操作可以完全在本地完成)

但客戶端編程的問題是:它與通常意義上的編程十分不同,參數幾乎相同,而平台卻不同。在 Web 瀏覽器中編程就像是使用一台功能受限的操作系統,而每一台功能還略微的有差別。最終,你不僅需要編寫程序,還需要處理因為平台不同帶來的兼容問題。

小結

因為「沒有交互」和「訪問緩慢」的問題,所以引入「客戶端編程」,因為引入客戶端編程,遇到「各種各樣不僅僅是平台差異帶來的問題」。

Java 的解決方案

插件和腳本語言 “差點意思”

在當時,客戶端編程所邁出的最重要的一步就是 插件(plug-in) 的開發。通過這種方式,用戶可以下載一段代碼,並將其插入到瀏覽器中適當的位置,以此來為瀏覽器添加新的功能。

  • 圖片來源:https://zhuanlan.zhihu.com/p/28889449

插件又引發了瀏覽器 腳本語言(scripting language) 的開發。通過使用某種腳本語言,你可以將客戶端程序的源代碼直接嵌入到 HTML 頁面中,解釋這種語言的插件在 HTML 頁面被显示時自動激活。(腳本語言可以解決客戶端編程中遇到的百分之八十的問題) 腳本語言先天就相當易於理解,因為它們只是作為 HTML 頁面一部分的簡單文本,當服務器收到要獲取該頁面的請求時,它們可以被快速加載。此方法的缺點是代碼會直接暴露給任何瀏覽(或竊取)的人,但是,通常不會使用腳本語言去做相當複雜的事情,所以這個缺點不會太嚴重。

如果腳本語言可以解決客戶端編程百分之八十的問題的話,那麼剩下那百分之二十 (那才是真正難啃的骨頭) 又該怎麼辦呢?

Java 帶來了 Applet

  • 圖片來源:https://www.ibm.com/developerworks/cn/java/

Java 帶着 Applet 及時出現。

1995 年, Java 之父 James Gosling 和 Sun 公司科學辦公室主任 John Gage 一起前往蒙特利,去參加一個 TED 會議,兩人要在那裡展示一個划時代的技術, 號稱向能把枯燥的靜態網頁變得栩栩如生,美輪美奐。

演示開始了,James Gosling 把鼠標指向了瀏覽器中的一個 3D 分子模型,來回地旋轉它,台下的觀眾發出陣陣驚嘆聲,他們被鎮住了,從沒有人想到在瀏覽器中也能實現這麼 “美輪美奐” 的效果 !

  • 圖片來源:https://zhuanlan.51cto.com/art/201911/606791.htm

Java 火了!

這個演示所使用的技術就是 Applet。

Applet 是只在 Web 瀏覽器中運行的小程序,它是作為網頁的一部分而自動下載的 (就像是網站圖片被自動下載一樣)。當 Applet 被激活時,它變開始執行一個程序,這正是它優雅的地方:它提供了一種分發軟件的方式,一旦用戶需要客戶端軟件時,就自動從服務器把客戶端軟件分發給用戶。

用戶獲取最新版本的客戶端軟件時不會產生錯誤,而且也不需要很麻煩的重新安裝過程 (有點像現在的小程序)。Java 的這種設計方式,使得程序員只需要創建單一的程序,而只要一台計算機有瀏覽器,且瀏覽器具有內置的 Java 解釋器 (大部分機器都有),那麼這個程序就可以自動在這台計算客戶端盡可能地多做事情。例如,不必跨網絡地發送一張請求表單來檢查自己是否填寫了錯誤的日期或者其他參數,客戶端計算機就可以快速地標出錯誤數據。

這不僅立即就獲得了快速的響應能力,而且也降低了網絡流量和服務器負載,從而不會使整個網絡的速度慢下來。

Java 對服務端編程的加持

當提出對服務器的請求之後,會發生什麼呢?大部分時間,請求只是要求「給我發送一個文件」,之後瀏覽器會以某種適當的形式解釋這個文件,例如將其作為 HTML 頁面、圖片、Java applet 或腳本程序等來解釋。

更複雜的對服務器的請求通常涉及數據庫,這可能會需要服務器端對請求到的數據進行一定的編排 (例如把數據嵌到一個表格之內) 來最終使其成為一個 HTML 文件發送給客戶端 (當然,如果客戶端具備更多的只能,你完全可以把原始數據發送給客戶端讓它自己進行編排工作..)。另一種常見的情形是:你註冊賬號或者提交訂單,這對數據庫數據造成了更改,而這些必須通過服務器端的某些代碼進行處理,這就是所謂的 服務端編程

Java 後來編寫的被稱為 Servlet 的程序 (及其衍生物 JSP),是許多開發網站的公司遷移到 Java 上的主要原因。尤其是因為憑藉 Java 跨平台的特性 消除了處理具有不同能力的瀏覽器時所遇到的問題

小結

Java 憑藉自身強大、安全、跨平台、國際化的特性,加上解決了當時客戶端、服務端開發的諸多 “痛點”,成功搭上 Internet 這列 “國際快車”,一躍成為了時下 20 實際 90 年代中) 最熱門的語言之一,並持續火熱至今 (這跟 Java 自身不斷地成熟有脫不開的關係)

現如今 Applet 和 Servlet 兩個技術已經逐步淡出人們的視野,但在 Java 的歷史上,是舉足輕重的兩個突破點。

Part 3. Hello Wrold!

  • 圖片來源:https://medium.com/@thiagonascimento/time-to-first-hello-world-11a4735602f2

當我們集中注意力 學習一種新的編程語言 時,教程上的 第一個案例 就是如何 在計算機屏幕上显示短語 Hello,world! 也許這條短語最知名的來源是貝爾實驗室的備忘錄《C 語言編程——一份教程》。這份材料編寫於 1974 年。不過在編寫於 1972 年的 B 語言教程中,我們同樣看到了這條短語的身影。

Hello, World! 是一種偉大的教學方法。這是一項能夠輕鬆完成的小任務,同時也代表着一種標準,體現出不同編程語言之間的重要差異。此外,這也是高級程序員在安裝新環境測試一切是否正常的快速簡便方法。(有時候,程序員們也會使用「hello world」運行時間來比較不同語言與環境的速度水平。) 也許更重要的是,Hello, world! 具有一種溫暖而柔和的力量,對編程新人有着一種莫名的親和力。

「代碼擁有無窮威力,而新的世界已經向你張開懷抱。」 ———— Chris Noessel,IBM 公司 AI 設計負責人

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

以上就是Java 語言版本 Hello World 程序。(現在看不懂也沒關係,可以進 https://c.runoob.com/compile/10 這個網站在線運行測試一下看看效果…)

至此,歡迎你進入 Java 的世界。

參考資料

  1. 《Thinking in Java》 第四版;
  2. 《Java 核心技術 卷 I》 第 11 版;
  3. The complete History of Java Programming Language – https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language/
  4. Java 發展簡史:初生遇低谷,崛起於互聯網 – https://www.chainnews.com/articles/628715645859.htm
  5. 永別了,Java的“小蘋果”! – https://zhuanlan.51cto.com/art/201911/606791.htm
  6. 改變世界的代碼行 – https://www.infoq.cn/article/5CaYH8NbS6BmptWKRgkX

往期精彩

  1. 「MoreThanJava」當大學選擇了計算機之後應該知道的
  2. 「MoreThanJava」計算機發展史—從織布機到IBM
  3. 「MoreThanJava」計算機系統概述
  4. 「MoreThanJava」一文了解二進制和CPU工作原理
  5. 「MoreThanJava」機器指令到彙編再到高級編程語言
  • 本文已收錄至我的 Github 程序員成長系列 【More Than Java】,學習,不止 Code,歡迎 star:https://github.com/wmyskxz/MoreThanJava
  • 個人公眾號 :wmyskxz,個人獨立域名博客:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!

非常感謝各位人才能 看到這裏,如果覺得本篇文章寫得不錯,覺得 「我沒有三顆心臟」有點東西 的話,求點贊,求關注,求分享,求留言!

創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章見!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※回頭車貨運收費標準

※產品缺大量曝光嗎?你需要的是一流包裝設計!

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※推薦評價好的iphone維修中心

※教你寫出一流的銷售文案?

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

這個配置能“防出軌” 15萬選這些家用車最放心

車身尺寸為4675*1780*1500mm,軸距達到了2710mm,乘坐空間上是比較寬敞的,加上柔軟的座椅,舒適性表現出色。動力方面,提供了1。2T和1。6T兩款發動機可選,匹配5擋手動或者6擋手自一體變速器,沉穩線性的油門調校讓動力非常容易掌控,動力總體表現出色。

隨着上個月的“超級丹”出軌事件后

辛辛苦苦塑造的男神形象毀於一旦

當然,更重要的是有媳婦的人被看得更緊了

上街口買串魚蛋都要向老婆申請

當然這隻是調侃一下

畢竟出軌並不是什麼好事情

但是隨着科技的發展

一種叫“車道偏離預警系統”的東西出現了

裝配在汽車上能有效提升行駛安全性

其工作原理是這樣的:在駕駛員未打轉向燈的情況下,電腦檢測到車輛偏離原車道之後,發出警報,以方向盤震動、發出警示音提醒等多種途徑提醒駕駛員,讓駕駛員及時糾正放向,有效減小事故的發生,哪些車上都有這種配置了,以下幾款15萬左右的合資車就有了。

北京現代-領動

指導價:9.98-15.18萬

一說起韓國品牌,就不得不提那大膽設計的外觀了,領動的設計是比較激進的,視覺衝擊力極強,狹長的大燈造型和碩大的六邊形中網給人留下很深刻的印象;純黑的內飾搭配紅色縫線整體感覺非常運動,中控液晶屏幕支持Carplay和CarLife功能,配置上很豐富,旗艦型車型上甚至裝備了主動安全系統。

2700mm的軸距為其乘坐空間提供了保證,462L的後備箱容積和可4/6比例放倒的後排座椅都能滿足日常使用的需求;其中1.4T車型採用了缸內直噴技術,最大功率為130馬力,搭配7速雙離合變速箱,動力的輸出也相對線性,對於渦輪遲滯的控制很好,幾乎感覺不到什麼遲滯現象。

東風雪鐵龍-雪鐵龍C4L

指導價:13.19-18.99萬

新款C4L的前臉變化是很明顯的,採用了上下橫貫式的進氣格柵,從雙立人車標延伸出來的鍍鉻飾條融入大燈內,看起來相當科幻前衛;內飾的變化卻沒外觀來的那麼強烈,與現款相差無幾,一些細節和配置上的升級更人性化了,电子手剎和全新樣式的換擋桿,操作起來更加方便順手了。

車身尺寸為4675*1780*1500mm,軸距達到了2710mm,乘坐空間上是比較寬敞的,加上柔軟的座椅,舒適性表現出色;動力方面,提供了1.2T和1.6T兩款發動機可選,匹配5擋手動或者6擋手自一體變速器,沉穩線性的油門調校讓動力非常容易掌控,動力總體表現出色。

東風本田-思域

指導價:11.59-16.99萬

思域整車採用全新的家族式設計語言打造,相比老款車型更具肌肉感,更多曲麵線條的運用,讓它在外觀方面更加飽滿立體,運動氣息很濃厚;內飾也是一改以往本田的風格,階梯狀設計的中控台錯落有致,大量的軟質材料覆蓋件也提高了不少檔次感,中央液晶儀錶盤功能豐富,显示效果出色。

2700mm的軸距使得新思域的空間有所改善,乘坐空間令人滿意,儲物空間也是比較多,半封閉的中央扶手箱是其中的亮點;1.5T發動機最大功率177馬力,搭配CVT變速器,起步輕盈暢快,動力輸出一氣呵成,渦輪介入感極其輕微,給人加速很線性的體驗,可以說這代思域迎來了脫胎換骨的一代。

總結:三款車的類型各有特色,適合的人群也更廣,配置豐富外觀帥氣的領動,底盤沉穩操控感好的雪鐵龍C4L,動力強勁高顏值的思域,到底哪個才是你的菜!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

這輛只要8萬起的車 頂級建築師和低調富二代都買

5L地球夢科技發動機,可以爆發出131匹強勁馬力,無論是起步加速還是中後段加速,全新鋒范的動力響應都表現的非常迅速,百公里10。2秒的加速時間更是在同級中名列前茅,滿足了年輕人的駕駛慾望。這樣的動力總成和強勁的加速性能和無論是對男主角時光,還是對很多追求速度的年輕人來說,都是很有吸引力的。

你難以靠近難以不再想念

我難以抗拒你容顏

把心畫在寫給你的信中

希望偶爾能夠見到你微笑的容顏

……

當這首熟悉的《難以抗拒你容顏》在電視里響起時,應該有無數人跟着哼唱了吧。沒錯,小編說的就是最近火爆的電視劇《咱們相愛吧》里女主之一蔡春娜在KTV里唱這首歌以至潸然淚下的劇情。這首歌勾起了她與劇中前男友的回憶,又何嘗沒有勾起大家對青春的回憶呢,簡直經典啊!所以這部劇紅也不是沒有道理,不僅身邊上至80歲跳廣場舞的阿姨下至18歲青春活潑的姑娘都沉迷其中,各大視頻網站也都佔據熱搜。

只見地鐵哪怕擠成狗,都有不少人堅決舉起手機在看;公司中午休息,女同事沉迷於劇情飯都顧不上吃;就連晚上跳廣場舞的大媽都提前結束回家追劇了。在好奇心的驅使下,小編也跟着看了起來。

而八點檔電視劇總有一種迷の魅力,一旦靠近就不可自拔。結果你們也猜到了,基本上是這樣的↓↓↓

但是!小編當然不是一個沉迷追劇不務正業的人,生活在哪裡汽車就在哪裡,電視看着看着就自然對裏面出現的汽車更關心一點,今天就來給大家八一八這部劇里出現頻率頗高的轎車——全新鋒范。

在劇里,它是男主角時光以及大毛的座駕,而兩位車主一個是著名的建築設計師,一個則是深藏不露的富二代,都不是“一般人”。 生活中小編身邊不少全新鋒范車主,也都是優質青年,可見這輛車對高品位人群的吸引力。

男主角時光作為一位建築設計師,對外觀的要求絕不會低。全新鋒范的外觀設計,恰恰符合了他的要求。飛翼式前臉突出凌厲與飽滿,車身上下雙腰線簡潔幹練,輪廓鮮明。翹起的尾部採用寬大設計,搭配鑽石切割的后尾燈組合,顯得動感又不失時尚。這種簡約不簡單的風格,與很多現代建築也是交相呼應的。

內飾未來感十足,布局層次分明。簡潔大氣的儀錶盤與中央的中控大屏、觸控式智能空調營造出科技感十足的駕駛氛圍,恍惚間會讓你覺得是在開一輛“未來之車”。

當然,全新鋒范的動力應該也是男主角時光選擇它的重要原因。這樣一個在生活中方方面面都追求完美的霸道總裁對動力也不會妥協。好在全新鋒范搭載的是本田1.5L地球夢科技發動機,可以爆發出131匹強勁馬力,無論是起步加速還是中後段加速,全新鋒范的動力響應都表現的非常迅速,百公里10.2秒的加速時間更是在同級中名列前茅,滿足了年輕人的駕駛慾望。這樣的動力總成和強勁的加速性能和無論是對男主角時光,還是對很多追求速度的年輕人來說,都是很有吸引力的。

而劇中另外一位開全新鋒范的主角大毛,一開始只是一個默默喜歡女主角芝芝的上班族,沒想到最後才知道,他的父親其實是有名的商人。

但大毛對此顯得不以為意,依舊每天開着一輛紅色全新鋒范靠自己的努力打拚一番事業。其實除掉富二代這個身份后,大毛和現在眾多打拚的年輕人並沒有區別,相比華而不實的超跑,一輛十萬級別,經濟適用的轎車反而才是事業上最大的助力。

與全新鋒范1.5L地球夢科技發動機相匹配的是支持自動啟停功能的CVT無級變速箱,平順、有力的換擋過程為駕駛者帶來暢快的加速體驗以及低至5.4L的百公里油耗表現。如此經濟的表現對於年輕人來說更是大大減輕了用車壓力。並且全新鋒范搭載了時下先進的科技配置,中控7英寸多功能互聯显示系統使車型氛圍充滿了未來感,除了可與多種主流手機型號連接並同步操作以外,屏幕內還集成了先進的三模式倒車影像,為駕駛者提供了一個清晰、直觀的後方視角,使車輛在倒車時更有安全保障。全新鋒范強大的功能配置以及突出的性價比,堪稱生活好幫手、創業好夥伴,難怪能成為了大毛的選擇。

綜合來看,決意東山再起的時光與憑藉自身努力創業的大毛選擇全新鋒范作為座駕再適合不過,外觀內飾極具現代感,高科技配置豐富,低油耗高動力,一切都恰好滿足年輕人的需求。並且不久前的廣州車展上,廣汽本田又推出了2017款鋒范1.5L CVT精英版,新增多達7項配置,使得外觀造型與實用性上都得到了更好的提升。在外觀上加入了15寸鋁質輪轂與後置短天線。在實用性方面加入了對於如今年輕人來說不可或缺的無鑰匙進入/一鍵啟動功能,靠近車門自動解鎖,出發前的系列動作一氣呵成,說不出的瀟洒與帥氣。而後排出風口的出現,在讓所有坐上你車的人都能得到享受的同時,更是使得整輛車達到了越級的表現。

2017款鋒范1.5L CVT精英版的官方指導價為9.58萬元。如此豐富的配置,售價卻未超出10萬,再加上即將結束的購置稅減半政策,性價比在同級車型中非常突出,可見廣汽本田的十足誠意。所以十萬級合資轎車中,2017款鋒范不失為一個上上之選。

追劇的同時不忘給大家推薦車型,小編感覺自己今天一米八!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

※回頭車貨運收費標準

動物園戶外展覽3袋鼠遭咬死 當局鎖定美洲獅涉案

摘錄自2020年6月21日聯合報報導

美國舊金山動物園近日舉行戶外展覽,孰料兩隻大袋鼠(wallaroos)和一隻紅袋鼠(red kangaroo)卻遭咬死,經過調查和可能是當地食肉動物犯案,目前已鎖定一隻美洲獅(山獅)涉有重嫌。

據《ABC》報導,這隻美洲獅之前因為在舊金山街道上遊蕩被捕獲,由加州大學聖克魯斯美洲獅計畫(University of California Santa Cruz Puma Project)為其戴上追蹤項圈,隨後便將牠野放。

加州野生動物局發言人帕格里亞(Ken Paglia)透露,在美洲獅重獲自由之前,舊金山動物園戶外展覽並沒有任何動物死亡因此,目前當局正朝著美洲獅犯案的方向進行調查,舊金山動物園則強調,園區已採取了額外的措施來保護動物的安全,但並未透露相關措施的細節。

國際新聞
美國
舊金山
袋鼠
美洲獅
展示動物
動物福利

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

印尼梅拉比火山兩度噴發 巨大灰雲衝6公里高

摘錄自2020年6月21日中央社報導

印尼地質署表示,梅拉比火山(Mount Merapi)是世界上最活躍的火山之一,今(20日)兩度噴發,向空中噴出6公里高的火山灰雲。

法新社報導,印尼地質署指出,這兩次噴發持續約7分鐘,促使地方當局下令居民待在火山口方圓3公里的禁區外。

梅拉比火山噴發後,印尼地質署沒有提高火山警戒狀態,但建議民航機在飛經此區時保持謹慎。

梅拉比火山上次大爆發是在2010年,導致300多人死亡,迫使附近約28萬人撤離。這也是1930年以來最大規模的噴發。

公害污染
空氣污染
土地水文
污染治理
土地利用
國際新聞
印度
火山噴發
火山灰
災害

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

慘!500 隻鬥牛犬搭飛機 擠滿貨艙38隻死在空中

摘錄自2020年6月22日自由時報報導

一架載著約500隻法國鬥牛犬的烏克蘭國際航空(UIA)航班,從俄國基輔起飛到達加拿大多倫多皮爾遜國際機場(Toronto Pearson Airport)時,發現貨艙內滿滿的法國鬥牛犬幼犬,其中38隻已經死亡,還有數十隻有脫水、嘔吐現象。

案件發生於本月13日,驚動加拿大官方,加拿大食品檢驗局(CFIA)在20日宣佈,就此事展開調查。烏克蘭航空雖在19日發聲明配合加拿大當局進行調查,也承諾要做必要改變來防止類似情況發生,但是至今仍未能解釋為何允許500隻動物登機。

國際航空運輸協會(IATA)對活體動物運輸有相關的規定,大多數加國航空只允許每航班載運2個動物運籠,且氣溫超過攝氏29.5°C,就一律拒載相關的籠內動物。

國際新聞
俄羅斯
加拿大
鬥牛犬
動物福利

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

這台車日行1200公里 連外國人都驚訝

上汽大通的海外市場表現澳新市場作為上汽大通的第一大海外市場,而且也是唯一獲得大批量歐洲政府採購、唯一進入歐洲國家政府執法機構的中國品牌,同時,在澳洲也成為了銷量第一的中國汽車品牌,在1-9月,上汽大通在澳新市場的銷量達到1791台,同比去年銷量增長了90。

一份值得學習的敬業

戴夫已經在陶朗加(新西蘭北島北部港市)生活了40多年,而對於工作,他說是一種享受,還必不想退休,每天工作的開始先從家中出發,北上漢密爾頓裝貨、再到北邊的奧克蘭進行卸貨和裝報,然後返回陶朗加換乘後半夜的司機繼續南下吉斯伯恩完成《先驅報》的送遞並返回家中。

戴夫從1986年開始從事送遞業務,一直從事報紙信件投遞的工作,30年送遞工作已經累計送達4000萬份貨物。

6年前,戴夫就為新西蘭的第一大報社《先驅報》(日報,日發行量15萬份)進行送貨,這條線路一年下來需要跑45萬公里,從第一次駕駛上汽大通的V80已經有2年多了,不到3年的時間里,前兩周破一百萬公里總行駛里程(三台V80里程合計)。

目前一共有5個司機,實行輪班制,負責陶朗加到漢密爾頓、奧克蘭再南下吉斯伯恩,並最後返回陶朗加約1200公里里程的線路,除了聖誕和復活節,工作風雨無阻,實行做三天休息三天的交替輪班制度,對於已經到了退休年齡的戴夫,還沒有考慮退休必很享受這份工作,會一直開下去。

上汽大通的海外市場表現

澳新市場作為上汽大通的第一大海外市場,而且也是唯一獲得大批量歐洲政府採購、唯一進入歐洲國家政府執法機構的中國品牌,同時,在澳洲也成為了銷量第一的中國汽車品牌,在1-9月,上汽大通在澳新市場的銷量達到1791台,同比去年銷量增長了90.9%,作為上汽大通的第一大海外市場,澳新市場的銷量佔據了上汽大通整個海外銷量的30%。

上汽在澳洲市場的大熱和良好的聲譽,其最根本的原因還是自身產品的性價比高,更合理的市場價,更合理的豐富的配置及良好的安全性和耐用性,都是讓它在市場立足必越來越強的原因,雖然大通進入澳州市場不久,但勢頭穩步上升,可見上汽集團的全球化戰略正初見成效,接下來,上汽大通還將向澳新市場導入一系列新品。包括純電動寬體輕客EV80、中高端皮卡、中大型SUV D90等,隨着新品投放,期待上汽大通如何將代表中國汽車,成為歐美日韓車系之外的又一股強大力量,不僅使中國汽車在澳新市場崛起,並且希望為澳新消費者帶來更多更優秀的產品和服務。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!