SpringCloud-Eureka註冊中心

什麼是微服務,分佈式?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>

 

訪問頁面成功

能夠看到咱們成功拿到了數據

到這裏咱們已經實現服務的註冊與發現,有問題請及時評論。

相關文章
相關標籤/搜索