1. 程式人生 > >零基礎快速入門SpringBoot2.0教程 (四)

零基礎快速入門SpringBoot2.0教程 (四)

trace ssh ket files frame ali serialize fis 系統服務

一、JMS介紹和使用場景及基礎編程模型
簡介:講解什麽是小寫隊列,JMS的基礎知識和使用場景

1、什麽是JMS: Java消息服務(Java Message Service),Java平臺中關於面向消息中間件的接口

2、JMS是一種與廠商無關的 API,用來訪問消息收發系統消息,它類似於JDBC(Java Database Connectivity)。這裏,JDBC 是可以用來訪問許多不同關系數據庫的 API

3、使用場景:
    1)跨平臺 
    2)多語言 
    3)多項目
    4)解耦
    5)分布式事務

    6)流量控制
    7)最終一致性
    8)RPC調用
        上下遊對接,數據源變動->通知下屬
4、概念    
    JMS提供者:Apache ActiveMQ、RabbitMQ、Kafka、Notify、MetaQ、RocketMQ
    JMS生產者(Message Producer)
    JMS消費者(Message Consumer)
    JMS消息
    JMS隊列
    JMS主題

    JMS消息通常有兩種類型:點對點(Point-to-Point)、發布/訂閱(Publish/Subscribe)

5、編程模型
    MQ中需要用的一些類
    ConnectionFactory :連接工廠,JMS 用它創建連接
    Connection :JMS 客戶端到JMS Provider 的連接
    Session: 一個發送或接收消息的線程
    Destination :消息的目的地;消息發送給誰.
    MessageConsumer / MessageProducer: 消息接收者,消費者

二、ActiveMQ5.x消息隊列基礎介紹和安裝

簡介:介紹ActiveMQ5.x消息隊列基礎特性和本地快速安裝
    特點:
        1)支持來自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各種跨語言客戶端和協議
        2)支持許多高級功能,如消息組,虛擬目標,通配符和復合目標
        3) 完全支持JMS 1.1和J2EE 1.4,支持瞬態,持久,事務和XA消息
        4) Spring支持,ActiveMQ可以輕松嵌入到Spring應用程序中,並使用Spring的XML配置機制進行配置
        5) 支持在流行的J2EE服務器(如TomEE,Geronimo,JBoss,GlassFish和WebLogic)中進行測試
        6) 使用JDBC和高性能日誌支持非常快速的持久化
        ...

    1、下載地址:http://activemq.apache.org/activemq-5153-release.html
    2、快速開始:http://activemq.apache.org/getting-started.html
    3、如果我們是32位的機器,就雙擊win32目錄下的activemq.bat,如果是64位機器,則雙擊win64目錄下的activemq.bat
    4、bin目錄裏面啟動 選擇對應的系統版本和位數,activeMQ start 啟動
    5、啟動後訪問路徑http://127.0.0.1:8161/

    6、用戶名和密碼默認都是admin
    7、官方案例集合
        https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples
    面板: 
    Name:隊列名稱。
    Number Of Pending Messages:等待消費的消息個數。
    Number Of Consumers:當前連接的消費者數目
    Messages Enqueued:進入隊列的消息總個數,包括出隊列的和待消費的,這個數量只增不減。
    Messages Dequeued:已經消費的消息數量。

三、SpringBoot2整合ActiveMQ實戰之點對點消息

簡介:SpringBoot2.x整合ActiveMQ實戰之點對點消息

1、官網地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-activemq

2、加入依賴
    <!-- 整合消息隊列ActiveMQ -->
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-activemq</artifactId>  
    </dependency>  

    <!-- 如果配置線程池則加入 -->
    <dependency>  
        <groupId>org.apache.activemq</groupId>  
        <artifactId>activemq-pool</artifactId>  
    </dependency>

 3、application.properties配置文件配置
    #整合jms測試,安裝在別的機器,防火墻和端口號記得開放
    spring.activemq.broker-url=tcp://127.0.0.1:61616

    #集群配置
    #spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617)

    spring.activemq.user=admin
    spring.activemq.password=admin
    #下列配置要增加依賴
    spring.activemq.pool.enabled=true
    spring.activemq.pool.max-connections=100

  4、springboot啟動類 @EnableJms,開啟支持jms

  5、模擬請求
    localhost:8080/api/v1/order?msg=12312321321312

  6、消費者:實時監聽對應的隊列
    @JmsListener(destination = "order.queue")

四、SpringBoot2整合ActiveMQ實戰之發布訂閱模式
簡介:SpringBoot整合ActiveMQ實戰之發布訂閱模式(pub/sub),及同時支持點對點和發布訂閱模型

    1、需要加入配置文件,支持發布訂閱模型,默認只支持點對點
        #default point to point
        spring.jms.pub-sub-domain=true

註意點:

    1、默認消費者並不會消費訂閱發布類型的消息,這是由於springboot默認采用的是p2p模式進行消息的監聽
        修改配置:spring.jms.pub-sub-domain=true

    2、@JmsListener如果不指定獨立的containerFactory的話是只能消費queue消息
        修改訂閱者container:containerFactory="jmsListenerContainerTopic"

        //需要給topic定義獨立的JmsListenerContainer
        @Bean
        public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
            DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
            bean.setPubSubDomain(true);
            bean.setConnectionFactory(activeMQConnectionFactory);
            return bean;
        }

        在配置文件裏面,註釋掉 #spring.jms.pub-sub-domain=true

五、RocketMQ4.x消息隊列介紹
簡介:阿裏開源消息隊列 RocketMQ4.x介紹和新概念講解

1、Apache RocketMQ作為阿裏開源的一款高性能、高吞吐量的分布式消息中間件
2、特點
    1)在高壓下1毫秒內響應延遲超過99.6%。
    2)適合金融類業務,高可用性跟蹤和審計功能。
    3)支持發布訂閱模型,和點對點
    4)支持拉pull和推push兩種消息模式
    5)單一隊列百萬消息
    6)支持單master節點,多master節點,多master多slave節點
    ...
3、概念
    Producer:消息生產者
    Producer Group:消息生產者組,發送同類消息的一個消息生產組

    Consumer:消費者
    Consumer Group:消費同個消息的多個實例

    Tag:標簽,子主題(二級分類),用於區分同一個主題下的不同業務的消息

    Topic:主題
    Message:消息
    Broker:MQ程序,接收生產的消息,提供給消費者消費的程序
    Name Server:給生產和消費者提供路由信息,提供輕量級的服務發現和路由     

3、官網地址:http://rocketmq.apache.org/

學習資源:
    1)http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/   
    2)https://www.jianshu.com/p/453c6e7ff81c

六、RocketMQ4.x本地快速部署
簡介:RocketMQ4.x本地快速部署

1、安裝前提條件(推薦)
    64bit OS, Linux/Unix/Mac
    64bit JDK 1.8+;

2、快速開始 http://rocketmq.apache.org/docs/quick-start/
   下載安裝包:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip

   路徑:/Users/jack/Desktop/person/springboot/資料/第13章/第5課/rocketmq-all-4.2.0-bin-release/bin

3、解壓壓縮包 
    1)進入bin目錄,啟動namesrv
         nohup sh mqnamesrv & 

    2) 查看日誌 tail -f nohup.out
    結尾:The Name Server boot success. serializeType=JSON 表示啟動成功

    3、啟動broker   
        nohup sh mqbroker -n 127.0.0.1:9876 &

    4)、關閉nameserver broker執行的命令
        sh mqshutdown namesrv
        sh mqshutdown broker

七、RoekerMQ4.x可視化控制臺講解
簡介:RoekerMQ4.x可視化控制臺講解

    1、下載 https://github.com/apache/rocketmq-externals
    2、編譯打包  mvn clean package -Dmaven.test.skip=true
    3、target目錄 通過java -jar的方式運行

    4、無法連接獲取broker信息
        1)修改配置文件,名稱路由地址為 namesrvAddr,例如我本機為
        2)src/main/resources/application.properties
            rocketmq.config.namesrvAddr=192.168.0.101:9876

    5、默認端口 localhost:8080

    6、註意:
        在阿裏雲,騰訊雲或者虛擬機,記得檢查端口號和防火墻是否啟動

八、Springboot2整合RocketMQ4.x實戰上集
簡介:Springboot2.x整合RocketMQ4.x實戰,加入相關依賴,開發生產者代碼

啟動nameser和broker

1、加入相關依賴
    <dependency>  
        <groupId>org.apache.rocketmq</groupId>  
        <artifactId>rocketmq-client</artifactId>  
        <version>${rocketmq.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>org.apache.rocketmq</groupId>  
        <artifactId>rocketmq-common</artifactId>  
        <version>${rocketmq.version}</version>  
    </dependency>  

2、application.properties加入配置文件      
    # 消費者的組名
    apache.rocketmq.consumer.PushConsumer=orderConsumer
    # 生產者的組名
    apache.rocketmq.producer.producerGroup=Producer
    # NameServer地址
    apache.rocketmq.namesrvAddr=127.0.0.1:9876

3、開發MsgProducer
     /**
     * 生產者的組名
     */
    @Value("${apache.rocketmq.producer.producerGroup}")
    private String producerGroup;

    /**
     * NameServer 地址
     */
    @Value("${apache.rocketmq.namesrvAddr}")
    private String namesrvAddr;

    private  DefaultMQProducer producer ;

    public DefaultMQProducer getProducer(){
        return this.producer;
    }

    @PostConstruct
    public void defaultMQProducer() {
        //生產者的組名
        producer = new DefaultMQProducer(producerGroup);
        //指定NameServer地址,多個地址以 ; 隔開
        //如 producer.setNamesrvAddr("192.168.100.141:9876;192.168.100.142:9876;192.168.100.149:9876"); 
        producer.setNamesrvAddr(namesrvAddr);
        producer.setVipChannelEnabled(false);

        try {
            /**
             * Producer對象在使用之前必須要調用start初始化,只能初始化一次
             */
            producer.start();

        } catch (Exception e) {
            e.printStackTrace();
        } 

        // producer.shutdown();  一般在應用上下文,關閉的時候進行關閉,用上下文監聽器

    }

九、Springboot2整合RocketMQ4.x實戰下集
簡介:Springboot2.x整合RocketMQ4.x實戰,開發消費者代碼,常見問題處理

1、創建消費者

問題:
    1、Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.42.1:10911> failed 

    2、com.alibaba.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [1647]ms, Topic: TopicTest1, BrokersSent: [broker-a, null, null]

    3、org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still failed, cost [497]ms, Topic: TopicTest, BrokersSent: [chenyaowudeMacBook-Air.local,     chenyaowudeMacBook-Air.local, chenyaowudeMacBook-Air.local]
    解決:多網卡問題處理
    1、設置producer:  producer.setVipChannelEnabled(false);
    2、編輯ROCKETMQ 配置文件:broker.conf(下列ip為自己的ip)
        namesrvAddr = 192.168.0.101:9876
        brokerIP1 = 192.168.0.101

    4、DESC: service not available now, maybe disk full, CL:
    解決:修改啟動腳本runbroker.sh,在裏面增加一句話即可:       
    JAVA_OPT="${JAVA_OPT} -Drocketmq.broker.diskSpaceWarningLevelRatio=0.98"
    (磁盤保護的百分比設置成98%,只有磁盤空間使用率達到98%時才拒絕接收producer消息)

    常見問題處理:
        https://blog.csdn.net/sqzhao/article/details/54834761
        https://blog.csdn.net/mayifan0/article/details/67633729
        https://blog.csdn.net/a906423355/article/details/78192828

十、SpringBoot多環境配置介紹和項目實戰(核心知識)
簡介:SpringBoot介紹多環境配置和使用場景

1、不同環境使用不同配置
    例如數據庫配置,在開發的時候,我們一般用開發數據庫,而在生產環境的時候,我們是用正式的數據
2、配置文件存放路徑
    classpath根目錄的“/config”包下
    classpath的根目錄下
3、spring boot允許通過命名約定按照一定的格式(application-{profile}.properties)來定義多個配置文件

十一、SprinBoot2.x響應式編程簡介
簡介:講解什麽是reactive響應式編程和使用的好處

1、基礎理解:
    依賴於事件,事件驅動(Event-driven)
    一系列事件稱為“流”
    異步
    非阻塞

    觀察者模式

網上的一個例子:
    int b= 2;
    int c=3
    int a = b+c  //命令式編程後續b和c變化,都不影響a
    b=5;

    int b= 2;
    int c= 3
    int a = b+c  //響應式編程中,a的變化,會和b、c的變化而變化(事件驅動)
    b=5;

2、官網:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux
    SpingBoot2底層是用spring5,開始支持響應式編程,Spring又是基於Reactor試下響應式。

學習資料
    1、reactive-streams學習資料:http://www.reactive-streams.org/
    2、web-flux相關資料:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux

十二、SpringBoot2.x響應式編程webflux介紹
簡介:講解SpringBoot2.x響應式編程介紹 Mono、Flux對象和優缺點

1、Spring WebFlux是Spring Framework 5.0中引入的新的反應式Web框架
與Spring MVC不同,它不需要Servlet API,完全異步和非阻塞,並 通過Reactor項目實現Reactive Streams規範。
RxJava

2、Flux和Mono  User List<User>
    1)簡單業務而言:和其他普通對象差別不大,復雜請求業務,就可以提升性能
    2)通俗理解:
        Mono 表示的是包含 0 或者 1 個元素的異步序列
            mono->單一對象 User     redis->用戶ID-》唯一的用戶Mono<User>  

        Flux 表示的是包含 0 到 N 個元素的異步序列
            flux->數組列表對象 List<User>   redis->男性用戶->Flux<User>
        Flux 和 Mono 之間可以進行轉換

3、Spring WebFlux有兩種風格:基於功能和基於註解的。基於註解非常接近Spring MVC模型,如以下示例所示:
    第一種:
        @RestController 
        @RequestMapping(“/ users”)
         public  class MyRestController {

            @GetMapping(“/ {user}”)
             public Mono <User> getUser( @PathVariable Long user){
                 // ...
            }

            @GetMapping(“/ {user} / customers”)
             public Flux <Customer> getUserCustomers( @PathVariable Long user){
                 // ...
            }

            @DeleteMapping(“/ {user}”)
             public Mono <User> deleteUser( @PathVariable Long user){
                 // ...
            }

        }
    第二種: 路由配置與請求的實際處理分開
        @Configuration
         public  class RoutingConfiguration {

            @Bean
             public RouterFunction <ServerResponse> monoRouterFunction(UserHandler userHandler){
                 return route(GET( “/ {user}”).and(accept(APPLICATION_JSON)),userHandler :: getUser)
                        .andRoute(GET(“/ {user} / customers”).and(accept(APPLICATION_JSON)),userHandler :: getUserCustomers)
                        .andRoute(DELETE(“/ {user}”).and(accept(APPLICATION_JSON)),userHandler :: deleteUser);
            }

        }

        @Component
        public class UserHandler {

            公共 Mono <ServerResponse> getUser(ServerRequest請求){
                 // ...
            }

            public Mono <ServerResponse> getUserCustomers(ServerRequest request){
                 // ...
            }

            公共 Mono <ServerResponse> deleteUser(ServerRequest請求){
                 // ...
            }
        }

4、Spring WebFlux應用程序不嚴格依賴於Servlet API,因此它們不能作為war文件部署,也不能使用src/main/webapp目錄

5、可以整合多個模板引擎
    除了REST Web服務外,您還可以使用Spring WebFlux提供動態HTML內容。Spring WebFlux支持各種模板技術,包括Thymeleaf,FreeMarker

十三、SpringBoot2.x webflux實戰
簡介:webflux響應式編程實戰

1、WebFlux中,請求和響應不再是WebMVC中的ServletRequest和ServletResponse,而是ServerRequest和ServerResponse

2、加入依賴,如果同時存在spring-boot-starter-web,則會優先用spring-boot-starter-web
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

    測試
    localhost:8080/api/v1/user/test

3、啟動方式默認是Netty,8080端口

4、參考:https://spring.io/blog/2016/04/19/understanding-reactive-types、

十四、服務端推送常用技術介紹
簡介:服務端常用推送技術介紹,如websocket,sse輪詢等
1、客戶端輪詢:ajax定時拉取

    2、服務端主動推送:WebSocket
        全雙工的,本質上是一個額外的tcp連接,建立和關閉時握手使用http協議,其他數據傳輸不使用http協議
        更加復雜一些,適用於需要進行復雜雙向數據通訊的場景

    3、服務端主動推送:SSE (Server Send Event)
        html5新標準,用來從服務端實時推送數據到瀏覽器端,
        直接建立在當前http連接上,本質上是保持一個http長連接,輕量協議
        簡單的服務器數據推送的場景,使用服務器推送事件 
        學習資料:http://www.w3school.com.cn/html5/html_5_serversentevents.asp

十五、高級篇幅之雲服務器介紹和部署生產環境實戰
1、阿裏雲服務器介紹和使用講解
簡介:阿裏雲服務器介紹和使用講解

2、阿裏雲Linux服務器部署JDK8實戰
簡介:在阿裏雲服務器上安裝JDK8和配置環境變量

lnux下使用wget下載jdk8:
進到目錄/usr/local/software

配置環境變量
vim /etc/profile
加入
export JAVA_HOME=/usr/local/software/jdk8
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH

使用 source /etc/profile   讓配置立刻生效

3、阿裏雲服務器SpringBoot2.x生產環境部署實戰
簡介:講解SpringBoot生產環境部署和常見註意事項

1、去除相關生產環境沒用的jar
    比如熱部署dev-tool

2、本地maven打包成jar包 
    mvn clean package  -Dmaven.test.skip=true 跳過測試

3、服務器安裝jdk,上傳Jar包
    上傳工具:
        windows:
            winscp
            securtyCRT
        mac:
            filezilla
    ssh [email protected]
    訪問路徑 http://120.79.160.143:8080/api/v1/user/find

    java -jar xxxx.jar

    守護進程、系統服務、shell腳本

    打包指定配置文件
        1、使用maven的profiles
        2、使用springboot的profile=active

訪問不了
    1、阿裏雲防火墻是否開啟,可以選擇關閉,關閉是不安全的,可以選擇開放端口
    2、阿裏雲的安全訪問組,開啟對應的端口,如果應用是以80端口啟動,則默認可以訪問

4、成熟的互聯網公司應該有的架構
    本地提交生產代碼->gitlab倉庫->Jenkins自動化構建->運維或者開發人員發布

十六、SpringBoot2.x監控Actuator實戰上集
簡介:講解SpringBoot使用actuator監控配置和使用

可用性:100%,99.9%

1、介紹什麽是actuator
    官方介紹:
        Spring Boot包含許多附加功能,可幫助您在將應用程序投入生產時監視和管理應用程序。 可以選擇使用HTTP端點或JMX來管理和監控您的應用程序,自動應用於審計,健康和指標收集;

    一句話:springboot提供用於監控和管理生產環境的模塊
    官方文檔:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready
2、加入依賴
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-actuator</artifactId>  
    </dependency> 

3、加入上述依賴後,訪問幾個url
        /actuator/health
        /actuator/info
        /actuator

十七、SpringBoot2監控Actuator下集及生產環境建議
簡介:SpringBoot2.x監控Actuator實戰下集及生產環境建議,SpringBoot新舊版本區別

註意點: 網上的資料大多數沒有講到訪問的前綴
端點基礎路徑由 / 調整到 /actuator
        如:/info調整為/actuator/info 
            /actuator/xxx

1、只能訪問幾個url
    1)需要在配置文件中加入下列配置
        management.endpoints.web.exposure.include=*

    2)官網說明:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security-actuator

        原因:
            出於安全考慮,除/ health和/ info之外的所有執行器默認都是禁用的。 management.endpoints.web.exposure.include屬性可用於啟用執行器
2、建議
    在設置management.endpoints.web.exposure.include之前,請確保暴露的執行器不包含敏感信息和/
    或通過將其放置在防火墻進行控制,不對外進行使用

    禁用的端點將從應用程序上下文中完全刪除。如果您只想更改端點所暴露的技術,請改用 include和exclude屬性 。
    例子:
        開啟全部:management.endpoints.web.exposure.include=*
        開啟某個:management.endpoints.web.exposure.include=metrics
        關閉某個:management.endpoints.web.exposure.exclude=metrics

    或者用springadmin進行管理
        相關資料:https://www.cnblogs.com/ityouknow/p/8440455.html

    或者用自己編寫腳本監控
    CPU、內存、磁盤、nginx的http響應狀態碼200,404,5xx 

3、介紹常用的幾個
    /health     查看應用健康指標
    /actuator/metrics   查看應用基本指標列表
    /actuator/metrics/{name}        通過上述列表,查看具體 查看具體指標
    /actuator/env       顯示來自Spring的 ConfigurableEnvironment的屬性  

更多學習資料可參考:https://xdclass.net/html/course_catalogue.html?video_id=4

http://edu.51cto.com/course/13539.html

零基礎快速入門SpringBoot2.0教程 (四)