什麼是微服務,分佈式?html
分佈式:不一樣的模塊部署在不一樣的服務器上,能夠更好的解決網站高併發。java
微服務:架構設計概念,各服務間隔離(分佈式也是隔離),自治(分佈式依賴總體組合)其它特性(單一職責,邊界,異步通訊,獨立部署)是分佈式概念的跟嚴格執行 SOA到微服務架構的演進過程
。簡單的說把項目拆分紅各各模塊,用註冊中心的方式把服務都連接在一塊兒web
服務提供者:提供服務被人調用算法
消費者:調用服務spring
Eureka是Netflix開發的服務發現框架,自己是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。tomcat
Eureka包含兩個組件:Eureka Server和Eureka Client。springboot
Eureka Server提供服務註冊服務,各個節點啓動後,會在Eureka Server中進行註冊,這樣EurekaServer中的服務註冊表中將會存儲全部可用服務節點的信息,服務節點的信息能夠在界面中直觀的看到。服務器
Eureka Client是一個java客戶端,用於簡化與Eureka Server的交互,客戶端同時也就是一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。網絡
環境搭建:架構
本次環境用Gradle+IDEA
1.先搭建註冊中心
主項目Gradle
group 'com.wang' version = '0.0.1-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 buildscript { ext {//定義一個變量,統一規定springboot的版本 springBootVersion = '1.5.10.RELEASE' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //Spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url 'http://repo.spring.io/plugins-snapshot' } } dependencies {//用來打包 classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } //設定當前全部的項目的配置 allprojects { group 'com.ssx' version = '0.0.1-SNAPSHOT' ext { springCloudVersion = 'Edgware.SR2' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //Spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url 'http://repo.spring.io/plugins-snapshot' } } } //設定當前模塊項目中的配置 subprojects { apply plugin: 'java' apply plugin: 'idea' apply plugin: 'spring-boot' dependencies { //使用springboot-web組件,可是排除tomcat組件 compile('org.springframework.boot:spring-boot-starter-web') { exclude module: "spring-boot-starter-tomcat" } //使用undertow做爲應用服務,做爲servlet容器 compile 'org.springframework.boot:spring-boot-starter-undertow' //使用健康檢查組件 compile 'org.springframework.boot:spring-boot-starter-actuator' testCompile( group: 'junit', name: 'junit', version: '4.12' ) } dependencyManagement { imports { //加上此配置後,若是須要引用springcloud的組件,就不須要再提供版本信息 mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } }
添加註冊中心的依賴
dependencies{ implementation 'org.springframework.cloud:spring-cloud-starter-eureka-server' }
註冊中心啓動類
@SpringBootApplication @EnableEurekaServer //表示這個項目爲eureka的註冊中心 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
註冊中心Yaml文件
server: port: 8085 spring: application: name: register-center eureka: client: register-with-eureka: false #啓動時不註冊 fetch-registry: false #不向註冊中心拉去數據 server: enable-self-preservation: false #關閉自我保護
啓動註冊中心,端口號爲8085
這個爲Eureka的信息頁面 能夠看到這個時候 Instances currently registered with Eureka裏面是No instances available 也就是這個時候尚未服務註冊進來,下面咱們寫註冊方,也就是客戶端
客戶端的啓動類
@SpringBootApplication @EnableEurekaClient //它是eureka客戶端也就是服務 public class ShoppingMallApplication { public static void main(String[] args) { SpringApplication.run(ShoppingMallApplication.class,args); } }
客戶端的yaml
server: port: 8086 spring: application: name: shopping-mall eureka: client: service-url: defaultZone: http://localhost:8085/eureka/
此時也要添加子項目的依賴
另外必須是指定註冊中心的端口號,往裏面註冊服務
從新訪問刷新註冊中心就能夠看到一個服務注入進來,solr服務類照葫蘆畫瓢
這個就是實現了 註冊也發現,那咱們緊接這 如何實現服務與服務之間調用呢?我如今想project-shopping-mall模塊的controller調用solr的controller如何實現呢?
@SpringBootApplication @EnableEurekaClient //它是eureka客戶端也就是服務 public class ShoppingMallApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ RestTemplate template=new RestTemplate(); return template; //表示網絡請求 } public static void main(String[] args) { SpringApplication.run(ShoppingMallApplication.class,args); } } @Controller public class ShopController { @Autowired RestTemplate restTemplate; @RequestMapping("/toIndex") public String toIndex(Model model){ String msg=restTemplate.getForEntity("http://SOLR/solrSear",String.class).getBody(); model.addAttribute("msg",msg); return "index"; } }
這個爲調用solr的controller根據名字調用
@RestController public class SolrController { @RequestMapping("/solrSear") public String solrSear(){ return "從solr查詢到數據"; } }
意思就是說 我在shop裏調用solr的controller他會返回一個從solr查詢到數據
這裏還須要添加一個依賴
dependencies{ implementation 'org.springframework.cloud:spring-cloud-starter-eureka-server' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf' }
shop模塊裏有thymeleaf模板展現數據,這個是咱們的index頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Title</title> </head> <body> <h1>歡迎進入商場</h1> <span th:text="${msg}"></span> </body> </html>
![](http://static.javashuo.com/static/loading.gif)
訪問頁面成功
能夠看到咱們成功拿到了數據