好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

如何使用Resttemplate和Ribbon调用Eureka实现负载均衡

1.服务注册和发现Eureka

可以用作服务治理。

2.首先我们建立一个父子工程

最外层是forezp

其下面建立四个子工程

eureka-server eureka-client eureka-client1 eureka-ribbon-client

3.forezp工程相关

1.forezp pom文件如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<? 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 >

    < parent >

      < groupId >org.springframework.boot</ groupId >

      < artifactId >spring-boot-starter-parent</ artifactId >

      < version >2.1.5.RELEASE</ version >

      < relativePath /> <!-- lookup parent from repository -->

    </ parent >

    < groupId >com.example</ groupId >

    < artifactId >forezp</ artifactId >

    < version >0.0.1-SNAPSHOT</ version >

    < name >forezp</ name >

    < description >Demo project for Spring Boot</ description > 

 

    < properties >

      < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding >

      < project.reporting.outputEncoding >UTF-8</ project.reporting.outputEncoding >

      < java.version >1.8</ java.version >

      < spring-cloud.version >Dalston.SR1</ spring-cloud.version >

    </ properties > 

 

    < dependencyManagement >

      < dependencies >

          < dependency >

            < groupId >org.springframework.cloud</ groupId >

            < artifactId >spring-cloud-dependencies</ artifactId >

            < version >${spring-cloud.version}}</ version >

            < type >pom</ type >

            < scope >import</ scope >

          </ dependency >

      </ dependencies >

    </ dependencyManagement > 

 

    < modules >

      < module >euraka-client</ module >

      < module >euraka-server</ module >

      < module >eureka-ribbon-client</ module >

      < module >euraka-client2</ module >

    </ modules > 

 

    <!--<build>-->

      <!--<plugins>-->

          <!--<plugin>-->

            <!--<groupId>org.springframework.boot</groupId>-->

            <!--<artifactId>spring-boot-maven-plugin</artifactId>-->

          <!--</plugin>-->

      <!--</plugins>-->

    <!--</build>-->

 

</ project >

4.Eureka的服务中心:eureka-server相关

1.pom文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<? 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 >

    < parent >

      < groupId >com.example</ groupId >

      < artifactId >forezp</ artifactId >

      < version >0.0.1-SNAPSHOT</ version >

      < relativePath /> <!-- lookup parent from repository -->

    </ parent >

    < groupId >com.example</ groupId >

    < artifactId >euraka-server</ artifactId >

    < version >0.0.1-SNAPSHOT</ version >

    < name >euraka-server</ name >

    < description >Demo project for Spring Boot</ description > 

 

    < properties >

      < java.version >1.8</ java.version >

      < spring-cloud.version >Greenwich.SR1</ spring-cloud.version >

    </ properties > 

 

    < dependencies >

      < dependency >

          < groupId >org.springframework.cloud</ groupId >

          < artifactId >spring-cloud-starter-netflix-eureka-server</ artifactId >

      </ dependency > 

 

      < dependency >

          < groupId >org.springframework.boot</ groupId >

          < artifactId >spring-boot-starter-test</ artifactId >

          < scope >test</ scope >

      </ dependency >

    </ dependencies > 

 

    < dependencyManagement >

      < dependencies >

          < dependency >

            < groupId >org.springframework.cloud</ groupId >

            < artifactId >spring-cloud-dependencies</ artifactId >

            < version >${spring-cloud.version}</ version >

            < type >pom</ type >

            < scope >import</ scope >

          </ dependency >

      </ dependencies >

    </ dependencyManagement > 

 

    < build >

      < plugins >

          < plugin >

            < groupId >org.springframework.boot</ groupId >

            < artifactId >spring-boot-maven-plugin</ artifactId >

          </ plugin >

      </ plugins >

    </ build > 

 

</ project >

2.application.properties文件

?

1

2

3

4

5

6

7

8

server.port=8761 

eureka.instance.hostname=localhost

 

#防止自己注册自己

eureka.client.register-with-eureka=false

eureka.client.fetch-registry=false

#eureka的注册地址

eureka.client.service-url.default-zone=http://${eureka.instance.hostname}:${server.port}/eureka/}

3.需要在启动类添加 @EnableEurekaServer 注解来开启注册服务

?

1

2

3

4

5

6

7

8

9

10

11

12

package com.example.eurakaserver;  

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 

 

@SpringBootApplication

@EnableEurekaServer

public class EurakaServerApplication {  

    public static void main(String[] args) {

      SpringApplication.run(EurakaServerApplication. class , args);

    }  

}

5.eureka-client和eureka-client1用来提供服务

这两个子工程其实区别不大,只是为了验证实现负载均衡。

1.pom文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

<? 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 >

     < parent >

         < groupId >com.example</ groupId >

         < artifactId >forezp</ artifactId >

         < version >0.0.1-SNAPSHOT</ version >

         < relativePath /> <!-- lookup parent from repository -->

     </ parent >

     < groupId >com.example</ groupId >

     < artifactId >euraka-client2</ artifactId >

     < version >0.0.1-SNAPSHOT</ version >

     < name >euraka-client2</ name >

     < description >Demo project for Spring Boot</ description >

 

     < properties >

         < java.version >1.8</ java.version >

         < spring-cloud.version >Greenwich.SR1</ spring-cloud.version >

     </ properties >

 

     < dependencies >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-web</ artifactId >

         </ dependency >

         < dependency >

             < groupId >org.springframework.cloud</ groupId >

             < artifactId >spring-cloud-starter-netflix-eureka-client</ artifactId >

         </ dependency >

 

         < dependency >

             < groupId >org.projectlombok</ groupId >

             < artifactId >lombok</ artifactId >

             < optional >true</ optional >

         </ dependency >

         < dependency >

             < groupId >org.springframework.boot</ groupId >

             < artifactId >spring-boot-starter-test</ artifactId >

             < scope >test</ scope >

         </ dependency >

     </ dependencies >

 

     < dependencyManagement >

         < dependencies >

             < dependency >

                 < groupId >org.springframework.cloud</ groupId >

                 < artifactId >spring-cloud-dependencies</ artifactId >

                 < version >${spring-cloud.version}</ version >

                 < type >pom</ type >

                 < scope >import</ scope >

             </ dependency >

         </ dependencies >

     </ dependencyManagement >

 

     < build >

         < plugins >

             < plugin >

                 < groupId >org.springframework.boot</ groupId >

                 < artifactId >spring-boot-maven-plugin</ artifactId >

             </ plugin >

         </ plugins >

     </ build >

 

</ project >

2.新建一个ApiController类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package com.example.eurakaclient2;  

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController; 

 

@RestController

public class ApiController { 

 

    @Value ( "${server.port}" )

    String port;

    @GetMapping ( "/hi" )

    public String home( @RequestParam String name1){

        return "hi " +name1+ "i am a port:" +port;

    }

}

3.eureka-client 的 apllication.properties配置如下

?

1

2

3

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

server.port=8762

spring.application.name=eureka-client

4.eureka-client2的 apllication.properties配置如下

?

1

2

3

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

server.port=8763

spring.application.name=eureka-client

5.需要在启动类添加注解 @EnableEurekaClient,开启服务提供

?

1

2

3

4

5

6

7

8

9

10

11

12

package com.example.eurakaclient2;  

import org.springframework.boot.SpringApplication;

      import org.springframework.boot.autoconfigure.SpringBootApplication;

      import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 

 

@SpringBootApplication

@EnableEurekaClient

public class EurakaClient2Application {  

    public static void main(String[] args) {

      SpringApplication.run(EurakaClient2Application. class , args);

    } 

}

6.eureka-ribbon-client工程相关

1.pom文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

<? 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 >

    < parent >

      < groupId >com.example</ groupId >

      < artifactId >forezp</ artifactId >

      < version >0.0.1-SNAPSHOT</ version >

      < relativePath /> <!-- lookup parent from repository -->

    </ parent >

    < groupId >com.example</ groupId >

    < artifactId >eureka-ribbon-client</ artifactId >

    < version >0.0.1-SNAPSHOT</ version >

    < name >eureka-ribbon-client</ name >

    < description >Demo project for Spring Boot</ description > 

 

    < properties >

      < java.version >1.8</ java.version >

      < spring-cloud.version >Greenwich.SR1</ spring-cloud.version >

    </ properties > 

 

    < dependencies >

      < dependency >

          < groupId >org.springframework.boot</ groupId >

          < artifactId >spring-boot-starter-web</ artifactId >

      </ dependency >

      < dependency >

          < groupId >org.springframework.cloud</ groupId >

          < artifactId >spring-cloud-starter-netflix-ribbon</ artifactId >

      </ dependency > 

 

      < dependency >

          < groupId >org.springframework.cloud</ groupId >

          < artifactId >spring-cloud-starter-netflix-eureka-client</ artifactId >

      </ dependency > 

 

      < dependency >

          < groupId >org.projectlombok</ groupId >

          < artifactId >lombok</ artifactId >

          < optional >true</ optional >

      </ dependency >

      < dependency >

          < groupId >org.springframework.boot</ groupId >

          < artifactId >spring-boot-starter-test</ artifactId >

          < scope >test</ scope >

      </ dependency >

    </ dependencies > 

 

    < dependencyManagement >

      < dependencies >

          < dependency >

            < groupId >org.springframework.cloud</ groupId >

            < artifactId >spring-cloud-dependencies</ artifactId >

            < version >${spring-cloud.version}</ version >

            < type >pom</ type >

            < scope >import</ scope >

          </ dependency >

      </ dependencies >

    </ dependencyManagement > 

 

    < build >

      < plugins >

          < plugin >

            < groupId >org.springframework.boot</ groupId >

            < artifactId >spring-boot-maven-plugin</ artifactId >

          </ plugin >

      </ plugins >

    </ build > 

 

</ project >

2.applicaiton.properties配置文件如下

?

1

2

3

spring.application.name=eureka-ribbon-client

server.port=8764

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

3.新建RibbonConfig类,在这里注入RestTemplate类同时开启负载均衡

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package com.example.eurekaribbonclient;  

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.client.RestTemplate; 

 

@Configuration

public class RibbonConfig { 

 

    @Bean

    @LoadBalanced

    RestTemplate restTemplate(){

        return new RestTemplate();

    }

}

4.新建service层,调用eureka-client (eureka-client1)提供的restful接口,其中 eureka-client 为  eureka-client (eureka-client1)注册在 eureka-service上的serviceId信息,如果没有配置serviceId,默认使用spring.application.name

?

1

2

3

4

5

6

7

8

9

10

11

12

13

package com.example.eurekaribbonclient;  

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.web.client.RestTemplate;  

 

    @Service

    public class RibbonService {

        @Autowired

    RestTemplate restTemplate;

    public String hi(String name){  

        return restTemplate.getForObject( "http://eureka-client/hi?name1=" +name,String. class );

    }

}

5.新建controller层,调用RibbonService为我们提供的方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

package com.example.eurekaribbonclient;  

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController; 

 

@RestController

public class RibbonController {

    @Autowired

    RibbonService ribbonService; 

 

    @GetMapping ( "/hi" )

    public String hi( @RequestParam (required = false ,defaultValue = "forezp" )String name){

        return ribbonService.hi(name);

    }

}

6.同时也需要在启动类添加@EnableEurekaClient注解

?

1

2

3

4

5

6

7

8

9

10

11

12

13

package com.example.eurekaribbonclient;  

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 

 

@SpringBootApplication

@EnableEurekaClient

public class EurekaRibbonClientApplication { 

 

    public static void main(String[] args) {

      SpringApplication.run(EurekaRibbonClientApplication. class , args);

    }  

}

7.验证

1.按照顺序启动工程

2.浏览器访问  http://localhost:8761/

可以看到EUREKA-CLIENT 和 EUREKA-RIBBON-CLIENT已经注册进来了 

3.我们访问 http://localhost:8764/hi?name=forezp 两次

可以看到  页面分别返回

hi forezpi am a port:8762

hi forezpi am a port:8763

这样验证了我们实现了负载均衡。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/qq_27707957/article/details/91348601

查看更多关于如何使用Resttemplate和Ribbon调用Eureka实现负载均衡的详细内容...

  阅读:11次