一、使用LoadBalancerClient

LoadBalancerClient接口的命名中,可以看出这是一个负载均衡客户端的抽象定义,spring提供了一个实现

org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient

1、pom.xml

<parent>

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

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

<version>2.1.7.RELEASE</version>

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

</parent>

<dependencies>

<dependency>

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

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

</dependency>

<dependency>

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

<artifactId>spring-cloud-starter-consul-discovery</artifactId>

</dependency>

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.47</version>

</dependency>

<dependency>

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

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

</dependency>

<dependency>

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

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

</dependency>

<!-- spring boot test -->

<dependency>

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

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

<scope>test</scope>

</dependency>

</dependencies>

2、application.yml

server:

#服务端口号

port: 8080

spring:

application:

#服务名称

name: vis-basic-report

thymeleaf:

cache: false

cloud:

consul:

host: 192.168.12.125

port: 8500

discovery:

#是否需要注册到consul中

register: true

#服务地址直接为IP地址

hostname: 192.168.12.1

management:

endpoints:

web:

exposure:

include: '*'

3、启动类

package com.wzl.springcloud.basic.report;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.servlet.ServletRegistrationBean;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.context.annotation.Bean;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;

@SpringBootApplication

@EnableDiscoveryClient

public class ReportServerApplication {

public static void main(String[] args) {

SpringApplication.run(ReportServerApplication.class, args);

}

}

4、相关实现类

package com.wzl.springcloud.basic.report.service;

import java.util.List;

import com.wzl.springcloud.basic.report.vo.City;

import com.wzl.springcloud.basic.report.vo.WeatherResponse;

public interface WeatherReportService {

// 根据城市ID同步天气

WeatherResponse getDataByCityId(String cityId);

// 根据城市name同步天气

WeatherResponse getDataByCityName(String cityName);

// 获取所有城市列表

List<City> getDataByCities();

}

package com.wzl.springcloud.basic.report.service.impl;

import java.util.List;

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

import org.springframework.cloud.client.ServiceInstance;

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

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Service;

import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;

import com.wzl.springcloud.basic.report.service.WeatherReportService;

import com.wzl.springcloud.basic.report.vo.City;

import com.wzl.springcloud.basic.report.vo.WeatherResponse;

/**

* LoadBalancer客户端

*/

@Service

public class WeatherReportServiceLoadBalancerClientImpl implements WeatherReportService {

@Autowired

private LoadBalancerClient loadBalancer;

@Override

public WeatherResponse getDataByCityId(String cityId) {

WeatherResponse weatherResponse = null;

ServiceInstance serviceInstance = loadBalancer.choose("vis-basic-weather");

String uri = serviceInstance.getUri().toString() + "/weather/cityId/" + cityId;

// 调用服务接口来获取

ResponseEntity<String> respString = new RestTemplate().getForEntity(uri, String.class);

// 判断ResponseEntity的状态码是否为200,为200时取出strBody

if (respString.getStatusCodeValue() == 200) {

String jsonStr = respString.getBody();

weatherResponse = JSON.parseObject(jsonStr, WeatherResponse.class);

}

return weatherResponse;

}

@Override

public WeatherResponse getDataByCityName(String cityName) {

WeatherResponse weatherResponse = null;

ServiceInstance serviceInstance = loadBalancer.choose("vis-basic-weather");

String uri = serviceInstance.getUri().toString() + "/weather/cityName/" + cityName;

// 调用服务接口来获取

ResponseEntity<String> respString = new RestTemplate().getForEntity(uri, String.class);

// 判断ResponseEntity的状态码是否为200,为200时取出strBody

if (respString.getStatusCodeValue() == 200) {

String jsonStr = respString.getBody();

weatherResponse = JSON.parseObject(jsonStr, WeatherResponse.class);

}

return weatherResponse;

}

@Override

public List<City> getDataByCities() {

List<City> cityList = null;

ServiceInstance serviceInstance = loadBalancer.choose("vis-basic-city");

String uri = serviceInstance.getUri().toString() + "/cities/getList";

// 调用服务接口来获取

ResponseEntity<String> respString = new RestTemplate().getForEntity(uri, String.class);

// 判断ResponseEntity的状态码是否为200,为200时取出strBody

if (respString.getStatusCodeValue() == 200) {

String jsonStr = respString.getBody();

cityList = JSON.parseArray(jsonStr, City.class);

}

return cityList;

}

}

二、使用Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

1、pom.xml

<parent>

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

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

<version>2.1.7.RELEASE</version>

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

</parent>

<dependencies>

<dependency>

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

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

</dependency>

<dependency>

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

<artifactId>spring-cloud-starter-consul-discovery</artifactId>

</dependency>

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.47</version>

</dependency>

<dependency>

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

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

</dependency>

<dependency>

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

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

</dependency>

<dependency>

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

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

</dependency>

<!-- spring boot test -->

<dependency>

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

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

<scope>test</scope>

</dependency>

</dependencies>

2、application.yml

server:

#服务端口号

port: 8080

spring:

application:

#服务名称

name: vis-basic-report

thymeleaf:

cache: false

cloud:

consul:

host: 192.168.12.125

port: 8500

discovery:

#是否需要注册到consul中

register: true

#服务地址直接为IP地址

hostname: 192.168.12.1

management:

endpoints:

web:

exposure:

include: '*'

3、启动类 & RestConfiguration

package com.wzl.springcloud.basic.report;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication

@EnableFeignClients

public class ReportServerApplication {

public static void main(String[] args) {

SpringApplication.run(ReportServerApplication.class, args);

}

}

package com.wzl.springcloud.basic.report.config;

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

import org.springframework.boot.web.client.RestTemplateBuilder;

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 RestConfiguration {

@Autowired

private RestTemplateBuilder builder;

@Bean

@LoadBalanced

public RestTemplate restTemplate() {

return builder.build();

}

}

@LoadBalanced注解表明这个restRemplate开启负载均衡的功能,用外汇返佣LoadBalancerClient配置,并且会替换URL中的服务名称为具体的IP地址

4、相关实现类

package com.wzl.springcloud.basic.report.service;

import java.util.List;

import com.wzl.springcloud.basic.report.vo.City;

import com.wzl.springcloud.basic.report.vo.WeatherResponse;

public interface WeatherReportService {

// 根据城市ID同步天气

WeatherResponse getDataByCityId(String cityId);

// 根据城市name同步天气

WeatherResponse getDataByCityName(String cityName);

// 获取所有城市列表

List<City> getDataByCities();

}

package com.wzl.springcloud.basic.report.service.impl;

import java.util.List;

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

import org.springframework.http.ResponseEntity;

import org.springframework.stereotype.Service;

import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;

import com.wzl.springcloud.basic.report.service.WeatherReportService;

import com.wzl.springcloud.basic.report.vo.City;

import com.wzl.springcloud.basic.report.vo.WeatherResponse;

/**

* Ribbon客户端

*/

@Service

public class WeatherReportServiceRibbonImpl implements WeatherReportService {

@Autowired

// 对rest客户端的封装

private RestTemplate restTemplate;

@Override

public WeatherResponse getDataByCityId(String cityId) {

WeatherResponse weatherResponse = null;

String uri = "http://vis-basic-weather/weather/cityId/" + cityId;

// 调用服务接口来获取

ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);

// 判断ResponseEntity的状态码是否为200,为200时取出strBody

if (respString.getStatusCodeValue() == 200) {

String jsonStr = respString.getBody();

weatherResponse = JSON.parseObject(jsonStr, WeatherResponse.class);

}

return weatherResponse;

}

@Override

public WeatherResponse getDataByCityName(String cityName) {

WeatherResponse weatherResponse = null;

String uri = "http://vis-basic-weather/weather/cityName/" + cityName;

// 调用服务接口来获取

ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);

// 判断ResponseEntity的状态码是否为200,为200时取出strBody

if (respString.getStatusCodeValue() == 200) {

String jsonStr = respString.getBody();

weatherResponse = JSON.parseObject(jsonStr, WeatherResponse.class);

}

return weatherResponse;

}

@Override

public List<City> getDataByCities() {

List<City> cityList = null;

String uri = "http://vis-basic-city/cities/getList";

// 调用服务接口来获取

ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);

// 判断ResponseEntity的状态码是否为200,为200时取出strBody

if (respString.getStatusCodeValue() == 200) {

String jsonStr = respString.getBody();

cityList = JSON.parseArray(jsonStr, City.class);

}

return cityList;

}

}

SpringCloud服务消费有哪几种方式?的更多相关文章

  1. XFire构建服务端Service的两种方式(转)

    XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...

  2. XFire构建服务端Service的两种方式

    1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...

  3. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  4. kbmmw 做REST 服务签名认证的一种方式

    一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. ...

  5. WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布

    1.写在前面 刚接触WCF不久,有很多地方知其然不知其所以然.当我在[创建服务->发布服务->使用服务]这一过程出现过许多问题.如客户端找不到服务引用:客户端只在本机环境中才能访问服务,移 ...

  6. 使用RestTemplate进行服务调用的几种方式

    首先我们在名为MSG的服务中定义一个简单的方法 @RestController public class ServerController { @GetMapping("/msg" ...

  7. Servlet实现的三种方式

    实现Servlet的三种方式:一个实现,两个继承 /*========================================== * servlet的执行过程: * 1.创建servlet对 ...

  8. 创建servlet的三种方式

    第一种方式,实现Servlet接口 package com.example.servlet; import java.io.IOException; import javax.servlet.Serv ...

  9. SparkStreaming消费kafka中数据的方式

    有两种:Direct直连方式.Receiver方式 1.Receiver方式: 使用kafka高层次的consumer API来实现,receiver从kafka中获取的数据都保存在spark exc ...

随机推荐

  1. Java 多态基础

    多态的定义 程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在运行期间才确定. 或者是同一个行为具有多个不同表现形式或形态的能力. 多态的体现 在玩LOL时,W ...

  2. JavaScript常用技巧之字符串操作

    1.首字母大写 str.replace(/\b\w+/g, function (word) { return word.substring(0, 1).toLowerCase() + word.sub ...

  3. 使用Gradle发布项目到JCenter仓库 (转载)

    原文:使用Gradle发布项目到JCenter仓库 这篇文章介绍通过Gradle把开源项目发布到公共仓库JCenter中,方便你我他的事情,我们都是很懒的嘛.JCenter现在是Android Stu ...

  4. Java中实现线程通信的三个方法的作用是什么?

    Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() ...

  5. rest framework之渲染器

    一.内置渲染器 REST框架包括许多内置的Renderer类,它们允许你使用各种媒体类型返回响应.还支持定义你自己的自定义渲染器. 内置渲染器的使用 1.全局设置 可以使用DEFAULT_RENDER ...

  6. 使用appium1.4在android8.0真机上测试程序时报错command failed shell "ps 'uiautomator'"的解决方式

    appium1.4,运行自动化脚本时提示 org.openqa.selenium.SessionNotCreatedException: A new session could not be crea ...

  7. SparkSQL的一些用法建议和Spark的性能优化

    1.写在前面 Spark是专为大规模数据处理而设计的快速通用的计算引擎,在计算能力上优于MapReduce,被誉为第二代大数据计算框架引擎.Spark采用的是内存计算方式.Spark的四大核心是Spa ...

  8. mobx中使用class语法或decorator修饰器时报错

    之前课程中老师用的babel的版本比较低,我在学习时安装的babel版本较高,因此每当使用class语法或decorator修饰器时都会出现一些报错的情况! ❌ ERROR in ./src/inde ...

  9. AJAX(包括跨域)post请求封装

    function ajaxPost(dataUrl, parameter, callback, bef_callback, com_callback, err_callback) { $.ajax({ ...

  10. cartographer和ROS的坐标系关系

    参考定义见:backpack_3d.lua    Local map frame是一次slam过程中的原点.但是现在cartographer支持Incremental mapping.global m ...