SpringCloud上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

Spring簡介

為什么要使用微服務(wù)

  • 單體應(yīng)用:

目前為止絕大部分的web應(yīng)用軟件采用單體應(yīng)用,所有的應(yīng)用的用戶UI、業(yè)務(wù)邏輯、數(shù)據(jù)庫訪問都打包在一個應(yīng)用程序上。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、駐馬店網(wǎng)站維護(hù)、網(wǎng)站推廣。

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

缺點(diǎn):

開發(fā)相互干擾,隨著應(yīng)用的不斷升級溝通協(xié)調(diào)成本增加
應(yīng)用上線由于某個功能升級導(dǎo)致需要整體的構(gòu)建、整體測試、整體發(fā)布
  • 微服務(wù)

把單體應(yīng)用拆分成小的、松藕合分布式服務(wù)的形式
每個應(yīng)用一定是獨(dú)立構(gòu)建、獨(dú)立部署與測試,應(yīng)用也是獨(dú)立發(fā)布,應(yīng)用于應(yīng)用直接通常通過restful API接口的形式進(jìn)行相互調(diào)用。
解決了單體應(yīng)用帶來的困擾。
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

Spring cloud 是什么

發(fā)展歷史

2002,Rod Johonson發(fā)表了<<Expert One-on-One J2EE Design and Development>>,
包含了3萬行的代碼在包c(diǎn)om.interface21中
2003,Juerge Hoeller,Yann Caroff 聯(lián)系Rod,將書中代碼開源,Yann提出Spring這個詞,冠于書中代碼;
并發(fā)布0.9,使用Apache 2.0協(xié)議;Thomas Risberg負(fù)責(zé)Spring JDBC;Ben Alex將Acegi Security貢獻(xiàn)給Rod和Juergen
2004,1.0發(fā)布
2005,<<Professional Java Development with Spring Framework>> <<Pro Spring>>出版;1.2.6發(fā)布。
AspectJ Leader Adrian Coyler加入Interface21作為首席科學(xué)家;
2006,Security 1.0、Spring webflow 1.0發(fā)布;Spring 2.0發(fā)布;
2007,Spring Batch、WebService、Integration發(fā)布;Spring 2.5發(fā)布;
2008,Spring Integration 1.0,Spring 2.5.6,Spring Batch 1.0;買了g2One,一家提供Groovy and Grails的公司;
2009,被VMWare發(fā)了42億美金買下;Spring Python、STS發(fā)布、3.0發(fā)布(將包拆開,不提供超級包),買了Cloud Foundry;
2010,VMWare買了RabbitMQ公司,獲得RabbitMQ和redis技術(shù);
2011,Spring 3.1、Spring AMQP、Spring Data JPA、Spring-data-common 1.0
、Spring Data Redis、Spring Data MongoDB發(fā)布;
2012,Rod Johnson離開VMWare;Spring Android、Mobile發(fā)布;
2013,VMWare 和 EMC 合力組建了一家公司,Pivotal。Spring 4.0、Spring Boot發(fā)布;
2014,Spring 4.1.3、SpringBoot 1.0發(fā)布;
2015,Spring 4.2、4.3發(fā)布;
2016,Spring 4.3 GA
2017,Spirng 5.x

Spring的出現(xiàn)讓EJB等重量級的容器技術(shù)逐漸走向末路。
Spring 通過對Bean的生命周期的管理,可以快速方便的實(shí)現(xiàn)業(yè)務(wù)的邏輯處理。
Spring 可以方便的整合幾乎所有的主流的開源項(xiàng)目如JPA,緩存,消息組合等等,方便的進(jìn)行開發(fā)。

Spring Cloud實(shí)戰(zhàn)

本實(shí)戰(zhàn)目的:
全程演示如何創(chuàng)建一個基礎(chǔ)的、可用的Spring cloud分布式應(yīng)用系統(tǒng)
演示Spring Cloud各部分組件如何在應(yīng)用之前協(xié)調(diào)、調(diào)用。
了解整個Spring Cloud的項(xiàng)目基本情況,有一個初步的認(rèn)識。
本實(shí)戰(zhàn)JAVA采用JDK8
Spring Boot版本采用最新2.1.0 release.
Spring Cloud版本采用Greenwich.M1。

2.2.1. Spring Cloud基礎(chǔ)搭建

使用

阿里云的spring cloud 架構(gòu)圖在線設(shè)計地址: https://www.freedgo.com 即可使用Freedgo Desing 進(jìn)行圖形設(shè)計.

架構(gòu)預(yù)覽地址:

<a target='blank' >https://www.freedgo.com/draw_index.html?#Uhttps://www.freedgo.com/templates/network/springcloud_aliyun.xml</a>

Freedgo Design 是一in款在線繪制專業(yè)圖形的網(wǎng)站。Freedgo Design可以繪制各種類型的圖形,針對業(yè)務(wù)邏輯的流程圖,軟件設(shè)計ER模板,工作流,各種云平臺的系統(tǒng)部署架構(gòu)圖包括阿里云、AWS云、騰訊云、Oracle、Asure云、IBM云平臺等。

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

2.2.1.1. 建立基礎(chǔ)代碼

開發(fā)工具:Intellij idea
1、 建立一個mvn 工程項(xiàng)目
使用的java jdk 采用jdk8

2.2.1.2. 服務(wù)發(fā)現(xiàn)

建立子模塊discovery-service
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

我們可以看到mvn 依賴導(dǎo)入了netflix-eureka-server
Spring boot 會啟動服務(wù)發(fā)現(xiàn)服務(wù)

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2.1.3. 服務(wù)配置

建立子模塊config-service
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.2.1.4. 服務(wù)路由

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

服務(wù)路由采用 Netflix Zuul
通過服務(wù)路由作為eureka client,可以被發(fā)現(xiàn)服務(wù)監(jiān)控

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

基礎(chǔ)的組件創(chuàng)建完畢

2.2.1.5. 用戶認(rèn)證中心

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

2.2.1.6. 業(yè)務(wù)服務(wù)模塊

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-oauth3</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-security</artifactId>
</dependency>

2.2.2. 服務(wù)發(fā)現(xiàn)

傳統(tǒng)服務(wù)發(fā)現(xiàn)方式通過網(wǎng)絡(luò)DNS和負(fù)載均衡設(shè)備實(shí)現(xiàn),需要網(wǎng)絡(luò)和硬件設(shè)置支持,維護(hù)成本高,網(wǎng)絡(luò)環(huán)境復(fù)雜
居于云的服務(wù)發(fā)現(xiàn)具有如下優(yōu)點(diǎn)
高可用,熱部署
負(fù)載均衡
健康檢查,容錯機(jī)制
抽象服務(wù)的邏輯名稱
使用Spring與Netflix Eureka實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)功能需要配置服務(wù)發(fā)現(xiàn)端及需要注冊服務(wù)配置客戶端
1、 發(fā)現(xiàn)服務(wù)端配置
服務(wù)注冊需要30 s 的時間才能顯示在 Eureka 服務(wù)中,因?yàn)?Eureka 需要從服務(wù)接收3次連續(xù)心跳包 ping,每次心跳包 ping 間隔10 s,然后才能使用這個服務(wù)。在部署和測試服務(wù)時,要牢記這一點(diǎn)。
application.yml

server:
  port: 8761
# Eureka 服務(wù)器將要監(jiān)聽的端口

eureka:
  client:
    registerWithEureka: false #不要使用 Eureka 服務(wù)進(jìn)行注冊
    fetchRegistry: false #不要在本地緩存注冊表信息  

使用一個新的注解@EnableEurekaServer,就可以讓我們的服務(wù)成為一個 Eureka 服務(wù)

2、 服務(wù)發(fā)現(xiàn)客戶端配置
以config-service為例
需要做2件事情
1、 成為服務(wù)發(fā)現(xiàn)的客戶端

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
</dependency>

2、 配置application.yml(對應(yīng)config-server來說我們只需要配置如下)

spring:
  cloud:
    config:
      discovery:
        enabled: true

啟動運(yùn)行查看

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

http://localhost:8761/eureka/apps/config-service。
應(yīng)用作為服務(wù)發(fā)現(xiàn)的客戶端設(shè)置
1、 添加客戶端依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、 配置application.yml

spring:
  application:
    name: business_service

eureka:
  instance:
    preferIpAddress: true
    #注冊服務(wù)的 IP,而不是服務(wù)器名稱
  client:
    registerWithEureka: true #向 Eureka 注冊服務(wù)
    fetchRegistry: true
    serviceUrl:  #拉取注冊表的本地副本
      defaultZone: http://localhost:8761/eureka/  #Eureka 服務(wù)的位置

同樣通過mvn spring-boot:run 打開http://localhost:8761 ,business_service已經(jīng)注冊成功

使用服務(wù)發(fā)現(xiàn)查×××

2.2.3. 用戶認(rèn)證中心

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

OAuth3協(xié)議說明:

整體OAuth協(xié)議包括兩方面:
1、 訪問授權(quán):用戶必須通過授權(quán)獲取令牌
2、 資源權(quán)限:通過授權(quán)的用戶訪問受保護(hù)的資源,根據(jù)定義訪問權(quán)限來決定是否可以訪問資源
配置說明:
啟用OAuth授權(quán)服務(wù)
增加@EnableAuthorizationServer 用于告訴 Spring Cloud,該服務(wù)將作為 OAuth3 服務(wù)

package com.yuaoq.train.business;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.oauth3.config.annotation.web.configuration.EnableAuthorizationServer;

@SpringBootApplication
@EnableResourceServer
@EnableAuthorizationServer
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

OAuth訪問授權(quán)配置,配置注冊的客戶端應(yīng)用程序

@Configuration
public class Auth3Config extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private UserDetailsService userDetailsService;
//    覆蓋 configure()方法。這定義了哪些客戶端將注冊到服務(wù)
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("yuaoq")
                .secret("{noop}secret")
                .authorizedGrantTypes(
                         "refresh_token",
                         "password",
                          "client_credentials")
                .scopes("webclient","mobileclient");
    }

//    該方法定義了 AuthenticationServerConfigurer 中使用的不同組件。這段代碼告訴 Spring 使用 Spring 提供的默認(rèn)驗(yàn)證管理器和用戶詳細(xì)信息服務(wù)

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)
     throws Exception {
        endpoints
                .authenticationManager(authenticationManager)
                .userDetailsService(userDetailsService);
    }
}

配置用戶權(quán)限

@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {

    @Override
    @Bean
//    AuthenticationManagerBean 被 Spring Security 用來處理驗(yàn)證
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    //      Security 使用 UserDetailsService 處理返回的用戶信息,這些用戶信息將由 Spring Security 返回
    @Override
    @Bean
    public UserDetailsService userDetailsServiceBean() throws Exception {
        return super.userDetailsServiceBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//             configure()方法是定義用戶、密碼和角色的地方
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password("{noop}password")
                .roles("ADMIN","USER")
                .and()
                .withUser("anyone")
                .password("{noop}password")
                .roles("USER");
    }
}

獲取用戶信息(提供給其他服務(wù)獲取用戶信息使用)

@GetMapping(value = "/auth/user")
public Map<String, Object> user(OAuth3Authentication user) {
    Map<String, Object> userInfo = new HashMap<>();
    userInfo.put("user", user.getUserAuthentication().getPrincipal());
    userInfo.put("authorities", AuthorityUtils.authorityListToSet(user.getUserAuthentication().getAuthorities()));
    return userInfo;
}

通過postman測試
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
自此提供了一個用戶認(rèn)證的微服務(wù)模塊.

2.2.3.1. 業(yè)務(wù)模塊微服務(wù)

1、 對外提供restful Api
@RestController:由spring web提供的居于restful 的接口標(biāo)簽
生成一個restful api

@PostMapping("/list")
public ResponseEntity<List<String>> getBusiness() throws Exception {
    List<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
   return Optional.of(list)
            .map(a -> new ResponseEntity<List<String>>(a, HttpStatus.OK))
            .orElseThrow(() -> new Exception("error"));
}

使用postman調(diào)用接口

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
從postman返回的結(jié)果可以看到401,未授權(quán)。
因?yàn)閎usiness_service服務(wù)引入了spring-cloud-starter-security 那么默認(rèn)是會對所有訪問做安全控制。

2、 服務(wù)的授權(quán)保護(hù)
現(xiàn)在business/list 是未授權(quán),那怎么配置一個受保護(hù)的oauth3.0資源,通過如下步驟
設(shè)置服務(wù)是一個受oauth保護(hù)的資源
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
定義應(yīng)用的OAuth屬性定義回調(diào) URL

security:
  oauth3:
    resource:
      user-info-uri: http://localhost:8282/auth/user

定義授權(quán)用戶可以訪問

@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    //     antMatchers()允許開發(fā)人員限制對受保護(hù)的 URL 和 HTTP DELETE 動詞的調(diào)用
//     hasRole()方法是一個允許訪問的角色列表,該列表由逗號分隔
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/v1/business/**")
                .hasRole("ADMIN")
                .anyRequest()
                .authenticated();
    }  
}

該段代碼說明具有ADMIN角色的用戶可以訪問/api/v1/business/ 下的所有的POST 請求
驗(yàn)證如下:
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

至此通過OAuth3.0保護(hù)微服務(wù)的基本做法已經(jīng)完成。

2.2.4. 服務(wù)路由網(wǎng)關(guān)
服務(wù)網(wǎng)關(guān):服務(wù)客戶端不再直接調(diào)用服務(wù)。取而代之的是,服務(wù)網(wǎng)關(guān)作為單個策略執(zhí)行點(diǎn)(Policy Enforcement Point,PEP),所有調(diào)用都通過服務(wù)網(wǎng)關(guān)進(jìn)行路由,然后被路由到最終目的地。
@EnabeZuulServer使用此注解將創(chuàng)建一個 Zuul 服務(wù)器,它不會加載任何 Zuul 反向代理過濾器,也不會使用 Netflix Eureka 進(jìn)行服務(wù)發(fā)現(xiàn).

成為一個服務(wù)網(wǎng)關(guān)步驟:
1、 添加@EnableZuulProxy
Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
2、 在application.yml添加route 規(guī)則

zuul:
  sensitive-headers: set-cookies
  routes:
    business_service: /busi/**

通過postman測試如下:

Spring Cloud 上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作

網(wǎng)站欄目:SpringCloud上手實(shí)戰(zhàn)-架構(gòu)解析及實(shí)作
網(wǎng)站網(wǎng)址:http://bm7419.com/article22/jcsijc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司靜態(tài)網(wǎng)站、網(wǎng)站制作、用戶體驗(yàn)、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作