目錄
一、項目架構演變過程
1、單體應用架構
2、垂直應用架構
3、分布式服務架構
4、流動計算架構(SOA架構)
5、微服務架構
二、如何實現微服務遠程調用
1、HttpClient工具類(springboot中)
形式1:調用第三方的公開服務
形式2:創建兩個微服務,兩個服務之間進行遠程服務調用
2、RestTemplate工具類(springboot中)
3、openFeign組件(springcloud中)
三、微服務架構的實現方式
1、dubbo(都是java語言開發的)
2、springcloud(不限制語言)
四、SpringCloud的簡介
4.1初識SpringCloud
4.2?為什么使用SpringCloud
4.3?SpringCloud相關組件(框架)
五、nacos注冊中心
1、搭建nacos注冊中心
2、注冊微服務到nacos注冊中心
一、項目架構演變過程
1、單體應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。此
時,用于簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
適用于小型網站,小型管理系統,將所有功能都部署到一個功能里,簡單易用。
缺點:1、性能擴展比較難 2、協同開發問題 3、不利于升級維護
2、垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個
應用,以提升效率。此時,用于加速前端頁面開發的Web框架(MVC)是關鍵。
通過切分業務來實現各個模塊獨立部署,降低了維護和部署的難度,團隊各司其職更易管
理,性能擴展也更方便,更有針對性。
缺點:公用模塊無法重復利用,開發性的浪費
3、分布式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐
漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用于提高業務
復用及整合的分布式服務框架是關鍵。
4、流動計算架構(SOA架構)
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中
心基于訪問壓力實時管理集群容量,提高集群利用率。此時,用于提高機器利用率的資源調
度和治理中心(SOA)[Service Oriented Architecture]是關鍵
5、微服務架構
微服務架構的特點
單一職責:微服務架構中每一個服務(模塊項目)都對應唯一的業務能力,做到單一職責
微:微服務的服務拆分粒度很小,例如一個用戶管理就可以作為一個服務。每個服務雖小,但“五臟俱全”。
面向服務:面向服務是說每個服務都要對外暴露Restful風格服務接口API。并不關心服務的
技術實現,做到與平臺和語言無關,也不限定用什么技術實現,只要提供Restful的接口即可。
自治:自治是說服務間互相獨立,互不干擾
- 團隊獨立:每個服務都是一個獨立的開發團隊,人數不能過多。
- 技術獨立:因為是面向服務,提供Restfule接口,使用什么技術沒有別人干涉
- 前后端分離:采用前后端分離開發,提供統一Rest接口,后端不用再為PC、移動段開發不同接口
- 數據庫分離:每個服務都使用自己的數據源
- 部署獨立,服務間雖然有調用,但要做到服務重啟不影響其它服務。有利于持續集成和持續交付。每個服務都是獨立的組件,可復用,可替換,降低耦合,易維護
二、如何實現微服務遠程調用
1、HttpClient工具類(springboot中)
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId>
</dependency>
形式1:調用第三方的公開服務
package com.hl.web;
?
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
?
import java.io.IOException;
?
@RestController
public class HelloController {@RequestMapping("/hello")public Object hello() throws IOException {//發起網絡請求,調用百度接口//1、構建一個HttpClient對象CloseableHttpClient client = HttpClientBuilder.create().build();//2、封裝一個httpGet 或者 post請求HttpGet request = new HttpGet("http://www.baidu.com");//3、發起網絡請求,獲取響應對象CloseableHttpResponse response = client.execute(request);//4、解析響應結果Integer code = response.getStatusLine().getStatusCode();System.out.println("響應狀態碼:"+code);HttpEntity entity = response.getEntity();return EntityUtils.toString(entity);}
}
形式2:創建兩個微服務,兩個服務之間進行遠程服務調用
http://localhost:8081/user/info
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/info")public User info(){return new User(1,"admin");}
}
@RequestMapping("/info")
public Object info() throws IOException {//發起網絡請求,調用百度接口//1、構建一個HttpClient對象CloseableHttpClient client = HttpClientBuilder.create().build();//2、封裝一個httpGet 或者 post請求HttpGet request = new HttpGet("http://localhost:8081/user/info");//3、發起網絡請求,獲取響應對象CloseableHttpResponse response = client.execute(request);//4、解析響應結果Integer code = response.getStatusLine().getStatusCode();System.out.println("響應狀態碼:"+code);HttpEntity entity = response.getEntity();String s = EntityUtils.toString(entity);User user = JSONObject.parseObject(s,User.class);return user;
}
2、RestTemplate工具類(springboot中)
@SpringBootApplication
public class ProjectAApplication {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
@RestController
public class HelloController {@Autowiredprivate RestTemplate restTemplate;
?@RequestMapping("/getUser")public User getUser(){return restTemplate.getForObject("http://localhost:8081/user/info", User.class);}
}
3、openFeign組件(springcloud中)
三、微服務架構的實現方式
1、dubbo(都是java語言開發的)
有Alibaba研發,后轉給apache維護。
2、springcloud(不限制語言)
spring組織提供的。 http協議遠程調用
四、SpringCloud的簡介
4.1初識SpringCloud
微 服 務 是 一 種 架 構 方 式 , 最 終 肯 定 需 要 技 術 架 構 去 實 施 。
微 服 務 的 實 現 方 式 很 多 , 但 是 最 火 的 莫 過 于 Spring Cloud了 。 為 什 么 ?
- 后臺硬:作為Spring家族的一員,有整個Spring全家桶靠山,背景十分強大。
- 技術強:Spring作為Java領域的前輩,可以說是功力深厚。有強力的技術團隊支撐,一般人還真比不了
- 群眾基礎好:可以說大多數程序員的成長都伴隨著Spring框架,試問:現在有幾家公司開發不用Spring?SpringCloud與Spring的各個框架無縫整合,對大家來說一切都是熟悉的配方,熟悉的味道。
- 使用方便:相信大家都體會到了SpringBoot給我們開發帶來的便利,而SpringCloud完全支持SpringBoot的開發,用很少的配置就能完成微服務框架的搭建
4.2?為什么使用SpringCloud
- SpringCloud是Spring旗下的項目之一,官網地址:http://projects.spring.io/spring-cloud/
- Spring最擅長的就是集成,把世界上最好的框架拿過來,集成到自己的項目中。
- SpringCloud也是一樣,它將現在非常流行的一些技術整合到一起,實現了諸如:配置管理,服務發現,智能路由,負載均衡,熔斷器,控制總線,集群狀態等等功能。
4.3?SpringCloud相關組件(框架)
- Eureka:服務治理組件,包含服務注冊中心,服務注冊與發現機制的實現。(服務治理,服務注冊/發現) ,類似的產品還有Consul、Nacos
- Spring Cloud GateWay:網關組件,提供智能路由,訪問過濾功能 ,類似產品還有Zuul
- Ribbon:客戶端負載均衡的服務調用組件(客戶端負載均衡)
- Feign:服務調用,給予Ribbon和Hystrix的聲明式服務調用組件 (聲明式服務調用) (發送Http請求訪問)
- Hystrix:容錯管理組件,實現斷路器模式,幫助服務依賴中出現的延遲和故障提供強大的容錯能力。(熔斷、斷路器,容錯)
nacos注冊中心
loadBalancer
openFeign
gateway
nacos配置中心
sentinel
五、nacos注冊中心
1、搭建nacos注冊中心
下載解壓縮到非中文目錄
啟動nacos服務(默認集群模式啟動)
以單機版模式啟動服務
?startup.cmd -m standalone
http://localhost:8848/nacos/
用戶名nacos 密碼nacos
2、注冊微服務到nacos注冊中心
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
@SpringBootApplication
@EnableDiscoveryClient //啟用服務發現組件的客戶端
public class ProjectCApplication {
?public static void main(String[] args) {SpringApplication.run(ProjectCApplication.class, args);}
?
}
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
#當前項目在nacos注冊中心暴漏的服務名
spring.application.name=projectC
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發現與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public
# 應用服務 WEB 訪問端口
server.port=8082