1. 程式人生 > >SpringCloud之Eureka服務治理中心

SpringCloud之Eureka服務治理中心

引用SpringCloud中文官網的一句話:

微服務架構集大成者,雲端計算最佳實踐,搭建分散式、微服務專案的一站式框架

Eureka介紹:

主要用來實現服務的註冊、發現

註冊中心建立:

  • 1.建立第一個Springboot專案,作為註冊中心,勾選cloudDescovry的:Eurekaserver
  • 2.在啟動類上註解:@EnableEurekaServer //標記這是註冊中心
  • 3.在application.yml中配置:
#埠號
server:
 port: 8761
eureka:
 instance:
#主機名稱
  hostname: localhost
 client:
#自身不註冊
registerWithEureka: false #不發現自身服務 fetchRegistry: false serviceUrl: #訪問地址,高可用,支援叢集,多個之間,隔開 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ spring: application: #服務名稱,強烈建議給每一個服務起個名字,含義為服務,要求不重複,這樣就好區分 name: server1803

注:測試時,一個專案中模擬啟動多個註冊中心,可copy啟動方式(左上角減號右邊按鈕),在環境配置中Vm Options框填寫:

-Dserver.port=8762

在這裡插入圖片描述

在yml的servicelUrl中配置叢集,採用逗號隔開,當然,這裡引用就不能寫相同的埠了。
驗證: http://localhost:8761

服務提供者建立:

  • 1、建立第二個springboot專案,作為提供者,勾選cloudDescovry的:Eurekaserver
  • 2、在啟動類上註解:@EnableEurekaClient //標記這是客戶端,提供者
  • 3、在application.yml中配置:
#設定埠
server:
  port: 9761

#連線資料庫
spring:
  datasource:
    driver-class-name
: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/sswd?useSSL=false username: root password: 123 type: com.alibaba.druid.pool.DruidDataSource application: name: provider1803 #註冊中心地址 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/

因為springcloud的提供者提供的是介面,所以正常的書寫mapper、service、controller的程式碼即可
等下需要在消費端service層配置對映的介面地址
驗證:
在這裡插入圖片描述

點選後邊的地址,得到如下
在這裡插入圖片描述
去掉後邊的actuator/info,在地址後拼接上介面地址:
在實際開發中,都是指定前段域名部分為一個固定名稱(需要配置),通過ip域名等方式訪問,如:

http://kam1996:9691/wordlist.do?flag=1
在這裡插入圖片描述
注意:雖然這是資料介面,返回的是xml格式資料。但請不要直接在消費者中直接訪問此路徑,直接訪問就相當於沒走註冊中心,也就 沒有實現服務的釋出與消費。

消費者建立:

  • 1、建立第三個Springboot專案,作為服務消費者勾選cloudDescovry的:Eurekaserver,同時勾選
    cloud routing中的ribbon或者feign,任選其一。兩種實現消費者的方式不同,實現方式如下:

ribbon實現:

  • 2、在啟動類上註解:
    @EnableEurekaClient//客戶端 @EnableDiscoveryClient//發現服務

  • 3、在application.yml中配置:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: ribbon1803
server:
  port: 10762
  • 4、配置類RibbonConfig:
@Configuration
public class RibbonConfig {
    @Bean
    @LoadBalanced		//啟用負載均衡
    public RestTemplate createTem(){
//交由ioc管理RestTemplate物件
        return new RestTemplate();
    }
}
  • 5、service中,注意是類class不是interface:
@Service
public class HiService {
    //注入ioc建立的resttemplate物件,由此物件的方法獲取資料
    @Autowired
    private RestTemplate restTemplate;

    public String hi(){
//get請求通過get開頭的方法,post通過post開頭的方法,根據返回值不同,選擇不同的方法即可
//這裡的請求地址使用http://server-name,來代替http://ip:port,因為在ribbon中它會根據
// 服務名來選擇具體的服務例項,根據服務例項在請求的時候會用具體的url替換掉服務名,這裡請求的是http://provider1803/hello.do
        return restTemplate.getForObject("http://PROVIDER1803/hello.do",String.class);
    }
}
  • 6、controller正常呼叫
  • 7、驗證:訪問controller介面即可

feign實現:(推薦)

  • 1、在啟動類上註解:
		@EnableEurekaClient//標記客戶端
        @EnableDiscoveryClient//發現服務
        @EnableFeignClients//消費者模板
  • 2、在application.yml中配置:
     #註冊中心地址
        eureka:
          client:
            serviceUrl:
              defaultZone: http://localhost:8761/eureka/
              
        spring:
          application:
          #服務名稱
            name: feign1803
            
        server:
          #埠
          port: 10761

3、除了service層程式碼與之前有點不同,其他一樣:

@FeignClient(value = "provider1803")
    public interface WordService {
        @RequestMapping(value = "/wordsave.do",method = RequestMethod.POST)
        public R save(@RequestBody Word word);
        @RequestMapping(value = "/wordlist.do",method = RequestMethod.GET)
        public List<Word> list(@RequestParam(value = "flag") int flag);
    }

解釋註解:
@FeignClient(value = “provider1803”):
指明將要消費的服務名稱

@RequestMapping(value = “/wordsave.do”,method = RequestMethod.POST):
指明提供者的controller中,書寫的對應的資料介面,value和method要與提供者一致
方法,而方法的方法名和引數返回值等皆與提供者的方法引數返回值一致。在於物件上加上了@RequestBody 這樣消費者才能訪問到提供者介面。即兩者之間是json格式傳輸的

@RequestParam(value = “flag”):
指定引數

4、Controller層

這裡要提到@ResponseBody 註解,此 讓我們的控制器不在呼叫viewresolve,而只是一個標記。至於消費介面返回的資料還是xml,我們可以在mapping註解里加上引數:

    produces = "application/json"

即可返回 json 格式的資料

驗證:

在這裡插入圖片描述