微服務和SpringCloud介紹
1.什么是微服務?
看過一遍介紹的很清楚的博客:https://blog.csdn.net/wuxiaobingandbob/article/details/78642020
微服務得從兩個方面去理解,什么是"微"、什么是"服務"。
微:狹義來講就是體積小、著名的"2 pizza 團隊"很好的詮釋了這一解釋(2個披薩 團隊最早是亞馬遜 CEO Bezos提出來的,意思是說單個服務的設計,所有參與人從設計、開發、測試、運維所有人加起來 只需要2個披薩就夠了 )。
服務:一定要區別於系統,服務一個或者一組相對較小且獨立的功能單元,是用戶可以感知最小功能集。
2.為什么要使用微服務
在傳統的IT行業軟件大多都是各種獨立系統的堆砌,這些系統的問題總結來說就是擴展性差,可靠性不高,維護成本高。到后面引入了SOA服務化,但是,由於 SOA 早期均使用了總線模式,這種總線模式是與某種技術棧強綁定的,比如:J2EE。這導致很多企業的遺留系統很難對接,切換時間太長,成本太高,新系統穩定性的收斂也需要一些時間。最終 SOA 看起來很美,但卻成為了企業級奢侈品,中小公司都望而生畏。
3.微服務的開發框架
目前微服務的開發框架,最常用的有以下四個:
-
Spring Cloud:http://projects.spring.io/spring-cloud(現在非常流行的微服務架構)
-
Dubbo:http://dubbo.io
-
Dropwizard:http://www.dropwizard.io (關注單個微服務的開發)
-
Consul、etcd&etc.(微服務的模塊)
4.什么是SpirngCloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring並沒有重復制造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
5.Spring、SpringCloud和SpringBoot的關系
Spring Boot可以離開Spring Cloud獨立使用開發項目,但是Spring Cloud離不開Spring Boot,屬於依賴的關系。
spring -> spring boot > Spring Cloud 這樣的關系。
普通的兩個程序直接的訪問
使用IDEA開發工具。
1.新建一個maven的父工程 ,並創建提供者工程和消費者工程。
2.將項目設置成springBoot項目,並添加對應的依賴。
- 設置parent項目的pom.xml
-
<?xml version="1.0" encoding="UTF-8"?> <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.aomeibox</groupId> <artifactId>springclouddemo</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>provider-user</module> <module>customer-order</module> </modules> <!-- 設置成springBoot項目 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <!-- SpringBoot依賴 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 設置提供者,設置成web工程,並且添加controller類和yml配置文件,端口和名稱修改,防止端口被占用。設置一個user對象,屬性和provider中相同
1 /** 2 * Created by leo on 2018/12/24. 3 */ 4 @RestController 5 public class UserController { 6 7 @GetMapping("/user/{id}") 8 public User getUser(@PathVariable Integer id){ 9 return new User(id); 10 } 11 }
server: port: 7900 #程序啟動后的端口 spring: application: name: provider-user #應用名稱
- 設置消費者,也需要設置成web工程,並且添加controller類和yml配置文件。設置一個user對象,屬性自己設置即可。
@SpringBootApplication public class CustomerOrder { @Bean //相當於xml的bean標簽,主要用於調用當前方法獲取到指定對象 public RestTemplate template(){ return new RestTemplate(); } public static void main( String[] args ) { SpringApplication.run(CustomerOrder.class); } }
@RestController public class OrderController { @Autowired private RestTemplate template;//spring提供的一個用於訪問rest接口的模板對象 private String url = "http://localhots:7900/user/"; @GetMapping("/order/{id}") public User getUser(@PathVariable Integer id){ //訪問提供者獲取數據 User user = template.getForObject(url + id, User.class);//通過訪問rest 獲取到json數據,然后轉換成User對象 return user; } }
這樣就可以通過一個消費者,去訪問服務提供者獲得數據。(未使用springcloud)。