摘要:服務器將要監聽的端口不要使用服務進行注冊不要在本地緩存注冊表信息使用一個新的注解,就可以讓我們的服務成為一個服務服務發現客戶端配置以為例需要做件事情成為服務發現的客戶端配置對應來說我們只需要配置如下啟動運行查看。
Spring簡介 為什么要使用微服務
單體應用:
目前為止絕大部分的web應用軟件采用單體應用,所有的應用的用戶UI、業務邏輯、數據庫訪問都打包在一個應用程序上。
缺點:
開發相互干擾,隨著應用的不斷升級溝通協調成本增加 應用上線由于某個功能升級導致需要整體的構建、整體測試、整體發布
微服務
把單體應用拆分成小的、松藕合分布式服務的形式
每個應用一定是獨立構建、獨立部署與測試,應用也是獨立發布,應用于應用直接通常通過restful API接口的形式進行相互調用。
解決了單體應用帶來的困擾。
2002,Rod Johonson發表了<>, 包含了3萬行的代碼在包com.interface21中 2003,Juerge Hoeller,Yann Caroff 聯系Rod,將書中代碼開源,Yann提出Spring這個詞,冠于書中代碼; 并發布0.9,使用Apache 2.0協議;Thomas Risberg負責Spring JDBC;Ben Alex將Acegi Security貢獻給Rod和Juergen 2004,1.0發布 2005,< > < >出版;1.2.6發布。 AspectJ Leader Adrian Coyler加入Interface21作為首席科學家; 2006,Security 1.0、Spring webflow 1.0發布;Spring 2.0發布; 2007,Spring Batch、WebService、Integration發布;Spring 2.5發布; 2008,Spring Integration 1.0,Spring 2.5.6,Spring Batch 1.0;買了g2One,一家提供Groovy and Grails的公司; 2009,被VMWare發了42億美金買下;Spring Python、STS發布、3.0發布(將包拆開,不提供超級包),買了Cloud Foundry; 2010,VMWare買了RabbitMQ公司,獲得RabbitMQ和Redis技術; 2011,Spring 3.1、Spring AMQP、Spring Data JPA、Spring-data-common 1.0 、Spring Data Redis、Spring Data Mongodb發布; 2012,Rod Johnson離開VMWare;Spring Android、Mobile發布; 2013,VMWare 和 EMC 合力組建了一家公司,Pivotal。Spring 4.0、Spring Boot發布; 2014,Spring 4.1.3、SpringBoot 1.0發布; 2015,Spring 4.2、4.3發布; 2016,Spring 4.3 GA 2017,Spirng 5.x
Spring的出現讓EJB等重量級的容器技術逐漸走向末路。
Spring 通過對Bean的生命周期的管理,可以快速方便的實現業務的邏輯處理。
Spring 可以方便的整合幾乎所有的主流的開源項目如JPA,緩存,消息組合等等,方便的進行開發。
本實戰目的:
全程演示如何創建一個基礎的、可用的Spring cloud分布式應用系統
演示Spring Cloud各部分組件如何在應用之前協調、調用。
了解整個Spring Cloud的項目基本情況,有一個初步的認識。
本實戰JAVA采用JDK8
Spring Boot版本采用最新2.1.0 release.
Spring Cloud版本采用Greenwich.M1。
阿里云的spring cloud 架構圖在線設計地址: https://www.freedgo.com 即可使用Freedgo Desing 進行圖形設計.
架構預覽地址:
https://www.freedgo.com/draw_...://www.freedgo.com/templates/network/springcloud_aliyun.xml
Freedgo Design 是一in款在線繪制專業圖形的網站。Freedgo Design可以繪制各種類型的圖形,針對業務邏輯的流程圖,軟件設計ER模板,工作流,各種云平臺的系統部署架構圖包括阿里云、AWS云、騰訊云、Oracle、Asure云、IBM云平臺等。
開發工具:Intellij idea
1、 建立一個mvn 工程項目
使用的java jdk 采用jdk8
建立子模塊discovery-service
我們可以看到mvn 依賴導入了netflix-eureka-server
Spring boot 會啟動服務發現服務
org.springframework.cloud spring-cloud-starter-netflix-eureka-server
建立子模塊config-service
2.2.1.4. 服務路由org.springframework.cloud spring-cloud-config-server
服務路由采用 Netflix Zuul
通過服務路由作為eureka client,可以被發現服務監控
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-zuul
基礎的組件創建完畢
2.2.1.5. 用戶認證中心2.2.2. 服務發現org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-oauth2 org.springframework.cloud spring-cloud-starter-security
傳統服務發現方式通過網絡DNS和負載均衡設備實現,需要網絡和硬件設置支持,維護成本高,網絡環境復雜
居于云的服務發現具有如下優點
高可用,熱部署 負載均衡 健康檢查,容錯機制 抽象服務的邏輯名稱
使用Spring與Netflix Eureka實現服務發現
實現服務發現功能需要配置服務發現端及需要注冊服務配置客戶端
1、 發現服務端配置
服務注冊需要30 s 的時間才能顯示在 Eureka 服務中,因為 Eureka 需要從服務接收3次連續心跳包 ping,每次心跳包 ping 間隔10 s,然后才能使用這個服務。在部署和測試服務時,要牢記這一點。
application.yml
server: port: 8761 # Eureka 服務器將要監聽的端口 eureka: client: registerWithEureka: false #不要使用 Eureka 服務進行注冊 fetchRegistry: false #不要在本地緩存注冊表信息
使用一個新的注解@EnableEurekaServer,就可以讓我們的服務成為一個 Eureka 服務
2、 服務發現客戶端配置
以config-service為例
需要做2件事情
1、 成為服務發現的客戶端
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、 配置application.yml(對應config-server來說我們只需要配置如下)
spring: cloud: config: discovery: enabled: true
啟動運行查看
http://localhost:8761/eureka/apps/config-service。
應用作為服務發現的客戶端設置
1、 添加客戶端依賴
org.springframework.cloud spring-cloud-starter-netflix-eureka-client
2、 配置application.yml
spring: application: name: business_service eureka: instance: preferIpAddress: true #注冊服務的 IP,而不是服務器名稱 client: registerWithEureka: true #向 Eureka 注冊服務 fetchRegistry: true serviceUrl: #拉取注冊表的本地副本 defaultZone: http://localhost:8761/eureka/ #Eureka 服務的位置
同樣通過mvn spring-boot:run 打開http://localhost:8761 ,business_service已經注冊成功
使用服務發現查找服務
2.2.3. 用戶認證中心OAuth2協議說明:
整體OAuth協議包括兩方面:
1、 訪問授權:用戶必須通過授權獲取令牌
2、 資源權限:通過授權的用戶訪問受保護的資源,根據定義訪問權限來決定是否可以訪問資源
配置說明:
啟用OAuth授權服務
增加@EnableAuthorizationServer 用于告訴 Spring Cloud,該服務將作為 OAuth2 服務
package com.yuaoq.train.business; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; @SpringBootApplication @EnableResourceServer @EnableAuthorizationServer public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
OAuth訪問授權配置,配置注冊的客戶端應用程序
@Configuration public class Auth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; // 覆蓋 configure()方法。這定義了哪些客戶端將注冊到服務 @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 提供的默認驗證管理器和用戶詳細信息服務 @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints .authenticationManager(authenticationManager) .userDetailsService(userDetailsService); } }
配置用戶權限
@Configuration public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override @Bean // AuthenticationManagerBean 被 Spring Security 用來處理驗證 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"); } }
獲取用戶信息(提供給其他服務獲取用戶信息使用)
@GetMapping(value = "/auth/user") public Mapuser(OAuth2Authentication user) { Map userInfo = new HashMap<>(); userInfo.put("user", user.getUserAuthentication().getPrincipal()); userInfo.put("authorities", AuthorityUtils.authorityListToSet(user.getUserAuthentication().getAuthorities())); return userInfo; }
通過postman測試
自此提供了一個用戶認證的微服務模塊.
1、 對外提供restful Api
@RestController:由spring web提供的居于restful 的接口標簽
生成一個restful api
@PostMapping("/list") public ResponseEntity> getBusiness() throws Exception { List
list = new ArrayList (); list.add("a"); list.add("b"); return Optional.of(list) .map(a -> new ResponseEntity >(a, HttpStatus.OK)) .orElseThrow(() -> new Exception("error")); }
使用postman調用接口
從postman返回的結果可以看到401,未授權。
因為business_service服務引入了spring-cloud-starter-security 那么默認是會對所有訪問做安全控制。
2、 服務的授權保護
現在business/list 是未授權,那怎么配置一個受保護的oauth2.0資源,通過如下步驟
設置服務是一個受oauth保護的資源
定義應用的OAuth屬性定義回調 URL
security: oauth2: resource: user-info-uri: http://localhost:8282/auth/user
定義授權用戶可以訪問
@Configuration public class ResourceServerConfig extends ResourceServerConfigurerAdapter { // antMatchers()允許開發人員限制對受保護的 URL 和 HTTP DELETE 動詞的調用 // 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 請求
驗證如下:
至此通過OAuth2.0保護微服務的基本做法已經完成。
2.2.4. 服務路由網關
服務網關:服務客戶端不再直接調用服務。取而代之的是,服務網關作為單個策略執行點(Policy Enforcement Point,PEP),所有調用都通過服務網關進行路由,然后被路由到最終目的地。
@EnabeZuulServer使用此注解將創建一個 Zuul 服務器,它不會加載任何 Zuul 反向代理過濾器,也不會使用 Netflix Eureka 進行服務發現.
成為一個服務網關步驟:
1、 添加@EnableZuulProxy
2、 在application.yml添加route 規則
zuul: sensitive-headers: set-cookies routes: business_service: /busi/**
通過postman測試如下:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74986.html
摘要:實戰高并發程序設計推薦豆瓣評分書的質量沒的說,推薦大家好好看一下。推薦,豆瓣評分,人評價本書介紹了在編程中條極具實用價值的經驗規則,這些經驗規則涵蓋了大多數開發人員每天所面臨的問題的解決方案。 很早就想把JavaGuide的書單更新一下了,昨晚加今天早上花了幾個時間對之前的書單進行了分類和補充完善。雖是終極版,但一定還有很多不錯的 Java 書籍我沒有添加進去,會繼續完善下去。希望這篇...
閱讀 2804·2021-11-19 11:35
閱讀 2582·2021-11-02 14:40
閱讀 1396·2021-09-04 16:48
閱讀 3009·2019-08-30 15:55
閱讀 1753·2019-08-30 13:11
閱讀 1956·2019-08-29 11:12
閱讀 1088·2019-08-27 10:52
閱讀 3157·2019-08-26 18:36