Java架構學習(四十)SpringCloud基礎&網站架構演變&微服務架構概述&SpringCloud概述&服務註冊與服務發現&搭建註冊中心Euraka&rest和fegin呼叫原理
阿新 • • 發佈:2018-12-19
一、網站架構演變過程
微服務架構 為什麼出現了SpringCloud
網站架構模式:
單點應用---->分散式系統面向於服務架構(SOA)體系 webservice---->微服務架構
web專案三層架構
如果在網際網路公司中,使用傳統架構技術開發會產生程式碼衝突。 所以需要拆分專案: 這就產生了分散式開發 分散式架構:就是將一個大專案,拆分成n個多個子專案。 如:會員系統、支付系統、訊息系統、微信系統 叢集:將同一個專案,部署在多個伺服器上。war包都相同 面向服務架構優點:程式碼服務、解耦、只適合大公司,人多的情況下使用。 缺點:網路延遲、分散式事務問題 小公司傳統專案: 分散式架構系統:就是將一個大專案,拆分成n多個子專案, 再使用rpc遠端呼叫技術。 你用過哪些rpc遠端呼叫框架: springCloud、Dubbo、HttpClient、Hessian SOA:面向於服務架構 通訊協議SOAP:就是Http協議+xml傳輸的。反序列化與反序列化。
二、微服務架構概述
1、微服務架構(分散式架構):是在傳統的SOA架構領域升級的。
微:就是細分
輕量級、通訊協議是Http協議+restful分格+json
來源:
注意:每一個服務都對應著一個數據庫
RPC遠端呼叫:使用http協議+json格式+restful分格
使用比較簡單的通訊就是使用httpclient
介面只能允許在內網訪問和外網進行介面對接。
主流的rpc解決框架:dubbo 、springCloud 微服務架構與面向服務架構區別: 面向與服務架構SOA:主要針對銀行裡面,xml格式。企業級的傳統專案 微服務系統中:會更加細分。http+json+restful輕量級。獨立執行
三、SpringCloud概述
1、介面地址怎麼管理?有沒有容錯機制?負載均衡、閘道器、路由策略、 介面限流、斷路。 微服務解決框架:SpringCloud SpringCloud解決什麼樣的問題? 答:SpringCloud是做rpc遠端呼叫的、配置管理、註冊中心(Eureka、ZK)、 服務發現(表示服務可以被別人呼叫) 服務註冊、斷路器、路由策略、負載均衡、 全域性鎖、分散式會話系統、客戶端呼叫。 介面閘道器(ZUUL)、服務管理系統。 SpringBoot與SpringCloud區別? 答:SpringBoot是簡化xm配置的,能快速整合框架 SpringCloud是一套微服務解決方案,主要用在RPC遠端呼叫。 關係是SpringCloud依賴介面(SpringMVC)與SpringBoot來實現的。
四、服務註冊與服務發現
1、SpringCloud註冊中心環境搭建 euraka
2、服務的註冊與發現
3、SpringCloud客戶端呼叫:rest呼叫、feign呼叫:客戶端呼叫
ribbon:負載均衡。
zuul:介面閘道器。
euraka:服務註冊。
案例:
會員服務提供使用者資訊
訂單服務:查詢訂單
訂單服務需要查詢使用者,訂單服務呼叫會員介面。
五、搭建註冊中心 euraka
註冊中心的作用:管理服務的。
案例環境搭建:
第一步:搭建註冊中心euraka
第二步:搭建介面提供工程
第三步:使用介面
一、搭建Eureka註冊中心
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.leeue</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring boot test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
2、application.yml檔案
server:
port: 8888
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
# eureka地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動類
package com.leeue.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //這個就是服務
public class EurakaApp {
public static void main(String[] args) {
SpringApplication.run(EurakaApp.class, args);
}
}
執行效果:
二、搭建服務提供者 介面提供 service-member
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.leeue</groupId>
<artifactId>39_service-member</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
application.yml
# 配置註冊中心地址
eureka:
client:
serviceUrl:
# 地址 加上/eureka
defaultZone: http://localhost:8888/eureka/
server:
port: 8762
spring:
application:
name: service-member
啟動類:
package com.leeue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //表示註冊到註冊中心裡面去
public class MemberApp {
public static void main(String[] args) {
SpringApplication.run(MemberApp.class, args);
}
}
啟動類
package com.leeue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //表示註冊到註冊中心裡面去 注意是client
public class MemberApp {
public static void main(String[] args) {
SpringApplication.run(MemberApp.class, args);
}
}
執行後在eureka裡面會找到這個服務
三、消費會員服務
服務呼叫使用:rest、feign
負載均衡使用ribbon
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.leeue</groupId>
<artifactId>39_service-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
server:
port: 8764
spring:
application:
name: service-order
service
package com.leeue.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* 使用rest方式呼叫介面
* @classDesc: 功能描述:()
* @author:<a href="[email protected]">李月</a>
* @Version:v1.0
* @createTime:2018年11月2日 下午4:44:55
*/
@Service
public class OrderMemberService {
@Autowired
private RestTemplate restTemplate; //注入rest模版
public List<String> getOrderUser(){
return restTemplate.getForObject("http://service-member/getMemberAll", List.class);
}
}
control
package com.leeue.control;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.leeue.service.OrderMemberService;
@RestController
public class OrderController {
@Autowired
OrderMemberService orderMemberService;
@RequestMapping("/getOrderAll")
public List<String> getOrderAll(){
System.out.println("訂單服務呼叫會員服務");
return orderMemberService.getOrderUser();
}
}
啟動類 啟動類要注意 注入@RestTemplate
package com.leeue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class, args);
}
/**
* 下面程式碼是 把
* @return
*/
@Bean //把ResTemplate注入到 Spring容器中去
@LoadBalanced //表示支援負載均衡
RestTemplate restTemplate() {
return new RestTemplate();
}
}
六、SpringCloud中rest、fegin呼叫原理
底層使用的技術原理分析:底層還是使用httpclient來呼叫。
兩個服務都註冊到註冊中心,地址也在註冊中心,如果一個服務要呼叫另一個服務,
就在註冊中心獲取到地址,然後本地使用httpclient進行請求資源。