0
点赞
收藏
分享

微信扫一扫

【教程】IDEA创建SpringCloud+Eureka+Zuul ( 三.一 ) Eureka-RestTemplate+Ribbon 服务消费者 使用者


 

【教程】IDEA创建SpringCloud ( 一 ) Eureka Server服务端项目

【教程】IDEA创建SpringCloud ( 二 ) Eureka Client 客户端项目

【教程】IDEA创建SpringCloud+Eureka+Zuul ( 三.一 ) Eureka-RestTemplate+Ribbon 服务消费者 使用者

 

 

代码参考:​​https://gitee.com/guanweiCode/SpringCloudGw​​

 

一 Eureka Server 注册中心

二 Eureka Client 服务提供者

三.一  RestTemplate+Ribbon 服务消费者 使用者

 

一般不直接调用所需的微服务,而是经过 提供注册服务 的 服务器server, 获取所需的服务提供者列表(为一个列表, 此列表包含了能提供相应服务的服务器),他们也许是个集群,因此server会返回一个 ip + 端口号的表, 这种在服务消费者一方挑选服务器为自己服务器的方式是一种客户端的负载均衡(参考nginx的负载均衡)

 

第一种调用方式为:restTemplate+ribbon

第二种调用方式为:feign

 

1. 同  一、二 搭建 SpringBoot项目环境, 后续创建步骤同一二 可以行查看

【教程】IDEA创建SpringCloud+Eureka+Zuul ( 三.一 ) Eureka-RestTemplate+Ribbon 服务消费者 使用者_maven

 

2.配置yml 同一二

server:
port: 8702 #服务消费方 消费者
eureka:
instance:
hostname: localhost
client:
service-url:
# 指定当前eureka客户端的注册地址 端口8700对应server的端口
defaultZone: http://${eureka.instance.hostname}:8700/eureka
spring:
application:
name: eureka-consumer #指定应用名称

3.配置pom 同二

 

不同点 增加这个依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

 

 

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.gw</groupId>
<artifactId>springcloud-eureka-serviceconsume</artifactId>
<version>1.0-SNAPSHOT</version>

<name>springcloud-eureka-serviceconsume</name>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<!-- 引入SpringBoot-parent父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>

<!-- 引入SpringCloud的euekea server依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!-- web服务 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>

</dependencies>

<!-- 指定下载源和使用SpringCloud的版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</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>

 

 

4. 创建启动类

package com.gw;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
* @Title: Eureka服务消费方 消费者
* @Description: 描述
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-02-19
* @Project SpringCloudDemo
* @Package com.gw
*/

/**
* //当前使用Eureka的Server
*/
@SpringBootApplication
/**
* 使用Eureka的server
*/
@EnableDiscoveryClient
public class EurekaConsumerApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}

}

 

5.

package com.gw.config;

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;

/**
* @Title: 标题
* @Description: 描述
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-02-20
* @Project springcloud-eureka-servicesupport
* @Package com.gw.config
*/
@Configuration
public class Beans {

/**
* 管理对象
* @return
*/
@Bean //告诉工厂, 这个方法需要自动注入
@LoadBalanced //需要做负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}


}

 

6. 创建消费者请求生产者的controller

package com.gw.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
* @Title: 消费者 调用服务的几种方式
* @Description: 描述
* @Version: v1.0
* @Author: Mr.Guan
* @Mail GuanWeiMail@163.com
* @DateTime: 2021-02
* @Project springcloud-eureka-servicesupport
* @Package com.gw.controller
*/
@RestController
@RequestMapping("/api")
public class ConsumerDemoController {

@Autowired
private LoadBalancerClient loadBalancerClient;

@Autowired
private RestTemplate restTemplate;


/**
* 第一种调用方式
* 直接调用, 跟普通http一样, 不经过注册中心的服务列表, 直接访问servicesupport, 做不到负载均衡
* @param s
* @return
*/
@RequestMapping("consummer1")
public String consummer1(String s){
System.out.println(String.format("【consummer】传入的值为 %s", s));

String forObject = new RestTemplate().getForObject(String.format("http://localhost:8701/api/helloWorld?s=%s", s), String.class);

return forObject;
}

/**
* 第二种调用方式
* 根据服务名 获取服务列表 根据算法选取某个服务 并访问某个服务的网络位置 达到负载均衡
* 用服务名 去注册中心获取服务列表, 当前客户端底层会做随机算法的选取获得服务并访问
* @param s
* @return
*/
@RequestMapping("consummer2")
public String consummer2(String s){

System.out.println(String.format("【consummer】传入的值为 %s", s));

ServiceInstance serviceInstance = loadBalancerClient.choose("EUREKA-SERVICE");

String forObject = new RestTemplate().getForObject(String.format("http://%s:%s/api/helloWorld?s=%s", serviceInstance.getHost(), serviceInstance.getPort(), s), String.class);

return forObject;
}

/**
* 第三种调用方式 需要restTemplate注入的方式 (推荐)
* 底层调用模式跟第二种调用方式一样
* @Configuration
*
*
* @param s
* @return
*/
@RequestMapping("consummer3")
public String consummer3(String s){
System.out.println(String.format("【consummer】传入的值为 %s", s));

String forObject = restTemplate.getForObject(String.format("http://EUREKA-SERVICE/api/helloWorld?s=%s", s), String.class);
return forObject;
}

}

 

7 创建完成 测试

启动 server

启动 servicesupport

启动 serviceconsume

 

访问

​​http://localhost:8702/api/consummer1?s=测试​​

​​http://localhost:8702/api/consummer2?s=测试​​

​​http://localhost:8702/api/consummer3?s=测试​​

【教程】IDEA创建SpringCloud+Eureka+Zuul ( 三.一 ) Eureka-RestTemplate+Ribbon 服务消费者 使用者_java_02

 

 

 

【教程】IDEA创建SpringCloud+Eureka+Zuul ( 三.一 ) Eureka-RestTemplate+Ribbon 服务消费者 使用者_java_03

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

举报

相关推荐

0 条评论