SpringCloud服务消费有哪几种方式?
一、使用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服务消费有哪几种方式?的更多相关文章
- XFire构建服务端Service的两种方式(转)
XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...
- XFire构建服务端Service的两种方式
1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...
- SpringCloud系列-整合Hystrix的两种方式
Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...
- kbmmw 做REST 服务签名认证的一种方式
一般对外提供提供REST 服务,由于信息安全的问题, 都要采用签名认证,今天简单说一下在KBMMW 中如何 实现简单的签名服务? 整个签名服务,模仿阿里大鱼的认证方式,大家可以根据实际情况自己修改. ...
- WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布
1.写在前面 刚接触WCF不久,有很多地方知其然不知其所以然.当我在[创建服务->发布服务->使用服务]这一过程出现过许多问题.如客户端找不到服务引用:客户端只在本机环境中才能访问服务,移 ...
- 使用RestTemplate进行服务调用的几种方式
首先我们在名为MSG的服务中定义一个简单的方法 @RestController public class ServerController { @GetMapping("/msg" ...
- Servlet实现的三种方式
实现Servlet的三种方式:一个实现,两个继承 /*========================================== * servlet的执行过程: * 1.创建servlet对 ...
- 创建servlet的三种方式
第一种方式,实现Servlet接口 package com.example.servlet; import java.io.IOException; import javax.servlet.Serv ...
- SparkStreaming消费kafka中数据的方式
有两种:Direct直连方式.Receiver方式 1.Receiver方式: 使用kafka高层次的consumer API来实现,receiver从kafka中获取的数据都保存在spark exc ...
随机推荐
- tomcat的首次登录配置
登录tomcat时需要输入账号密码,而账号密码需要在配置文件中配置好才能使用. 此处我们先点击取消,tomcat会弹出一个提示界面: 这个界面的大致意思是: 401未经授权 您无权查看此页面. 如果您 ...
- 同一子网建立ssh通道,映射到本地
在办公室有一台机器连入同一子网络,开启jupyter-notebook但是只能在这台机器上访问到,怎样可以在家也可以访问呢? 此时最简单的方法是在本地建立一个ssh通道: 在本地终端中输入 ssh u ...
- 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest E:Black or White
这道题可以比较容易看出是线性DP.设dp[i]代表把前i个格子刷成目标状态的最小步数. 写出状态转移方程 dp[i]=min( dp[j]+calc(j+1,i) ) (i-j<=k) calc ...
- vue 页面回退mounted函数不执行的问题及解决方法
前言 最近做项目碰到一个很头大的问题--从a页面跳到b页面进行编辑,编辑完再返回a页面,却没走a页面的钩子函数mounted,数据没有更新 经过一番面向百度研究,终于找到了问题所在.接下来就记录一下这 ...
- leetcode-162周赛-1255-得分最高的单词集合
题目描述: 方法:穷举暴力 class Solution: def maxScoreWords(self, words: List[str], letters: List[str], score: L ...
- 使用用Intellij Idea从Github上获取代码
1.打开File菜单,选择Setting,在Version Control下找到Github. 2.分别在Login与Password中输入自己在Github注册的用户名和密码,然后点击Test按钮: ...
- 高级运维(一):反向代理&使用Varnish加速Web
案例1.反向代理 目标: 1.代理服务器可以将远程的Web服务器页面缓存于本地 2.代理服务器端口设置为80端口 3.用户通过访问代理服务器即可获得远程Web服务器页面上的内容 4.远程We ...
- RestHighLevelClient客户端相关CURD操作
客户端连接 public void start() { try { restHighLevelClient = new RestHighLevelClient( RestClient.builder( ...
- 实现Tab键的空格功能
有时使用编辑框需要用到按Tab键空两格,可能这时Tab键的功能不是空格而是页面切换等,这时需要设置: $(document).bind('keydown', function (event) { if ...
- python培训拾遗
20140421 1. 三大利器: dir----列出所有内部方法 a=1 dir(a) 可以列出所有内部方法,就是带两个下划线的:带一个下划线的是普通方法 help---查看帮助 help(a.bi ...