每天學點SpringCloud(二):服務註冊與發現Eureka

 

 

相信看過 每天學點SpringCloud(一):簡單服務提供者消費者調用的同學都發現了,在最後消費者調用提供者的時候把提供者的地址硬編碼在了代碼中,這樣的方式肯定是不行的,今天,我們就是要Eureka來解決這個問題

 

 

 

創建Eureka服務

 

1.我們在原先項目的基礎上再新建一個項目cloud-demo-eureka

此項目的依賴爲

<?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">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>cn.org.zhixiang</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-demo-eureka</artifactId>

    <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>
            <!--注意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-eureka-server-->
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
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">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>cn.org.zhixiang</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-demo-eureka</artifactId>

    <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>
            <!--注意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-eureka-server-->
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

2.創建application.yml

spring:
  application:
    name: eureka-server
#開啓權限認證
  security: 
    basic:
      enabled: true
    user:
      name: root
      password: root

server:
  host: localhost
  port: 8761
eureka:
  client:
    #此項目不作爲客戶端註冊
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #開啓權限驗證後Eureka地址爲 用戶名:密碼@地址:端口號,如未開啓權限驗證則直接使用 地址:端口號
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${server.host}:${server.port}/eureka


  application:
    name: eureka-server
#開啓權限認證
  security: 
    basic:
      enabled: true
    user:
      name: root
      password: root

server:
  host: localhost
  port: 8761
eureka:
  client:
    #此項目不作爲客戶端註冊
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #開啓權限驗證後Eureka地址爲 用戶名:密碼@地址:端口號,如未開啓權限驗證則直接使用 地址:端口號
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${server.host}:${server.port}/eureka

 

3.創建cn.org.zhixiang包,在此包下創建CloudDemoEureApplication啓動類

package cn.org.zhixiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class CloudDemoEureApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudDemoEureApplication.class, args);
    }
}
 cn.org.zhixiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class CloudDemoEureApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudDemoEureApplication.class, args);
    }
}

 

4.如果您開啓了權限驗證並且SpringBoot版本爲2.0以上的話還需要一個操作,如果不是此布可以忽略

因爲2.0默認開啓了csrf,如果我們現在直接啓動Eureka服務的話客戶端是註冊不上的,所以需要把csrf關閉

在cn.org.zhixiang包下新建security包,新建WebSecurityConfigurer類

@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

 

5.在CloudDemoEureApplication啓動類中啓動Eureka服務,瀏覽器訪問http://localhost:8761/eureka,輸入用戶名root和密碼root登陸Eureka後Eureka服務創建成功。

 

修改服務提供者

 

1.在原先的cloud-demo-provider項目中添加Eureka依賴

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 

2.修改application.yml,增加以下配置

eurekaServer:
  host: localhost
  port: 8761
  user: root
  password: root

eureka:
  client:
    #將此項目註冊到Eureka服務
    register-with-eureka: true
    service-url:
      defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka

  host: localhost
  port: 8761
  user: root
  password: root

eureka:
  client:
    #將此項目註冊到Eureka服務
    register-with-eureka: true
    service-url:
      defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka

 

3.在CloudDemoProviderApplication啓動類中增加一個註解:@EnableEurekaClient標示此項目是Eureka客戶端

 

4.緊接着先啓動剛纔創建的Eureka服務再啓動此項目,當我們再次訪問Eureka的時候可以發現我們的項目已經註冊上了Eureka

 

 

5.因爲我們此次需要玩點高大上的了,所以只有一個服務提供者肯定是不行的,我們copy一下上方的cloud-demo-provider項目,新項目命名爲cloud-demo-provider-2,這個新項目需要修改的地方只有三個:

第一是pom文件中的項目id注意不要與上個項目一樣,推薦直接叫做cloud-demo-provider-2.

第二是yml文件中spring.application.name應該是與上個項目都一樣的,名字叫做:provider-demo。這個不做修改,只需要修改server.port,保證端口不會衝突,比如我改成了8079

第三是UserController,可以看到上個項目返回的User是硬編碼的叫做張三的,這次這個項目我們把這個張三修改成李四,來區分這兩個項目

 

修改完畢以後啓動項目Eureka中應該是這樣的

就是這個provider-demo的服務有兩個提供者的意思

 

修改消費者

 

現在我們已經開始修改上次服務地址硬編碼的問題了

 

1.cloud-demo-consumer項目增加Eureka依賴

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.啓動類中增加了兩個註解

@SpringBootApplication
@EnableEurekaClient
public class CloudDemoConsumerApplication {
   @Bean
   @LoadBalanced//開啓負載均衡
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
   public static void main(String[] args) {
      SpringApplication.run(CloudDemoConsumerApplication.class, args);
   }
}

@EnableEurekaClient
public class CloudDemoConsumerApplication {
   @Bean
   @LoadBalanced//開啓負載均衡
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
   public static void main(String[] args) {
      SpringApplication.run(CloudDemoConsumerApplication.class, args);
   }
}

 

3.在UserController中做一下改變

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable Long id){
         return restTemplate.getForObject("http://provider-demo/user/getUser/"+id,User.class);
    }
}

@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable Long id){
         return restTemplate.getForObject("http://provider-demo/user/getUser/"+id,User.class);
    }
}

可以看到,我們上次使用的localhost:8078/user/getUser已經換成了provider-demo/user/getUser了。不知道大家還記不記得這個provider-demo麼?它呢,是兩個項目中spring.application.name的屬性值,在Eureka中呢,就對應着一個服務的id,也就是說在Eureka中,我們可以不使用ip+端口而是使用Ip去訪問服務。

 

大家將這四個項目都啓動起來以後,訪問http://localhost:8088/user/getUser/5,是不是發現一會會返回張三,一會會返回李四呢。這個就是我們一開始加的@LoadBalanced註解,也就是開啓了Eureka的負載均衡。這樣的話我們是不是已經完美的完成了昨天遺留的問題呢?

 

GitHub:https://github.com/2388386839/spring-cloud-demo

碼雲:https://gitee.com/zhixiang_blog/apring-cloud-demo

 

如果對您有所幫助,請記得幫忙點一個star哦

 

本文出自https://zhixiang.org.cn/#/blog/read/3e9e73fd-bda0-4638-826b-cceb43b77b07,轉載請保留。

相信看過 每天學點SpringCloud(一):簡單服務提供者消費者調用的同學都發現了,在最後消費者調用提供者的時候把提供者的地址硬編碼在了代碼中,這樣的方式肯定是不行的,今天,我們就是要Eureka來解決這個問題

 

創建Eureka服務

 

1.我們在原先項目的基礎上再新建一個項目cloud-demo-eureka

此項目的依賴爲

<?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">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>cn.org.zhixiang</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-demo-eureka</artifactId>

    <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>
            <!--注意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-eureka-server-->
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
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">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>cn.org.zhixiang</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-demo-eureka</artifactId>

    <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>
            <!--注意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-eureka-server-->
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

2.創建application.yml

spring:
  application:
    name: eureka-server
#開啓權限認證
  security: 
    basic:
      enabled: true
    user:
      name: root
      password: root

server:
  host: localhost
  port: 8761
eureka:
  client:
    #此項目不作爲客戶端註冊
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #開啓權限驗證後Eureka地址爲 用戶名:密碼@地址:端口號,如未開啓權限驗證則直接使用 地址:端口號
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${server.host}:${server.port}/eureka


  application:
    name: eureka-server
#開啓權限認證
  security: 
    basic:
      enabled: true
    user:
      name: root
      password: root

server:
  host: localhost
  port: 8761
eureka:
  client:
    #此項目不作爲客戶端註冊
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #開啓權限驗證後Eureka地址爲 用戶名:密碼@地址:端口號,如未開啓權限驗證則直接使用 地址:端口號
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${server.host}:${server.port}/eureka

 

3.創建cn.org.zhixiang包,在此包下創建CloudDemoEureApplication啓動類

package cn.org.zhixiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class CloudDemoEureApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudDemoEureApplication.class, args);
    }
}
 cn.org.zhixiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class CloudDemoEureApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudDemoEureApplication.class, args);
    }
}

 

4.如果您開啓了權限驗證並且SpringBoot版本爲2.0以上的話還需要一個操作,如果不是此布可以忽略

因爲2.0默認開啓了csrf,如果我們現在直接啓動Eureka服務的話客戶端是註冊不上的,所以需要把csrf關閉

在cn.org.zhixiang包下新建security包,新建WebSecurityConfigurer類

@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

 

5.在CloudDemoEureApplication啓動類中啓動Eureka服務,瀏覽器訪問http://localhost:8761/eureka,輸入用戶名root和密碼root登陸Eureka後Eureka服務創建成功。

 

修改服務提供者

 

1.在原先的cloud-demo-provider項目中添加Eureka依賴

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 

2.修改application.yml,增加以下配置

eurekaServer:
  host: localhost
  port: 8761
  user: root
  password: root

eureka:
  client:
    #將此項目註冊到Eureka服務
    register-with-eureka: true
    service-url:
      defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka

  host: localhost
  port: 8761
  user: root
  password: root

eureka:
  client:
    #將此項目註冊到Eureka服務
    register-with-eureka: true
    service-url:
      defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka

 

3.在CloudDemoProviderApplication啓動類中增加一個註解:@EnableEurekaClient標示此項目是Eureka客戶端

 

4.緊接着先啓動剛纔創建的Eureka服務再啓動此項目,當我們再次訪問Eureka的時候可以發現我們的項目已經註冊上了Eureka

 

 

5.因爲我們此次需要玩點高大上的了,所以只有一個服務提供者肯定是不行的,我們copy一下上方的cloud-demo-provider項目,新項目命名爲cloud-demo-provider-2,這個新項目需要修改的地方只有三個:

第一是pom文件中的項目id注意不要與上個項目一樣,推薦直接叫做cloud-demo-provider-2.

第二是yml文件中spring.application.name應該是與上個項目都一樣的,名字叫做:provider-demo。這個不做修改,只需要修改server.port,保證端口不會衝突,比如我改成了8079

第三是UserController,可以看到上個項目返回的User是硬編碼的叫做張三的,這次這個項目我們把這個張三修改成李四,來區分這兩個項目

 

修改完畢以後啓動項目Eureka中應該是這樣的

就是這個provider-demo的服務有兩個提供者的意思

 

修改消費者

 

現在我們已經開始修改上次服務地址硬編碼的問題了

 

1.cloud-demo-consumer項目增加Eureka依賴

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.啓動類中增加了兩個註解

@SpringBootApplication
@EnableEurekaClient
public class CloudDemoConsumerApplication {
   @Bean
   @LoadBalanced//開啓負載均衡
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
   public static void main(String[] args) {
      SpringApplication.run(CloudDemoConsumerApplication.class, args);
   }
}

@EnableEurekaClient
public class CloudDemoConsumerApplication {
   @Bean
   @LoadBalanced//開啓負載均衡
   public RestTemplate restTemplate(){
      return new RestTemplate();
   }
   public static void main(String[] args) {
      SpringApplication.run(CloudDemoConsumerApplication.class, args);
   }
}

 

3.在UserController中做一下改變

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable Long id){
         return restTemplate.getForObject("http://provider-demo/user/getUser/"+id,User.class);
    }
}

@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getUser/{id}")
    public User getUser(@PathVariable Long id){
         return restTemplate.getForObject("http://provider-demo/user/getUser/"+id,User.class);
    }
}

可以看到,我們上次使用的localhost:8078/user/getUser已經換成了provider-demo/user/getUser了。不知道大家還記不記得這個provider-demo麼?它呢,是兩個項目中spring.application.name的屬性值,在Eureka中呢,就對應着一個服務的id,也就是說在Eureka中,我們可以不使用ip+端口而是使用Ip去訪問服務。

 

大家將這四個項目都啓動起來以後,訪問http://localhost:8088/user/getUser/5,是不是發現一會會返回張三,一會會返回李四呢。這個就是我們一開始加的@LoadBalanced註解,也就是開啓了Eureka的負載均衡。這樣的話我們是不是已經完美的完成了昨天遺留的問題呢?

 

GitHub:https://github.com/2388386839/spring-cloud-demo

碼雲:https://gitee.com/zhixiang_blog/spring-cloud-demo

 

如果對您有所幫助,請記得幫忙點一個star哦

 

本文出自https://zhixiang.org.cn,轉載請保留。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章