SpringCloud服务消费有哪几种方式?

一、使用LoadBalancerClient
LoadBalancerClient接口的命名中,可以看出这是一个负载均衡客户端的抽象定义,spring提供了一个实现
org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient
1、pom.xml

org.springframework.boot
spring-boot-starter-parent
2.1.7.RELEASE




org.springframework.boot
spring-boot-starter-actuator


org.springframework.cloud
spring-cloud-starter



com.alibaba
fastjson
1.2.47


org.springframework.boot
spring-boot-starter-thymeleaf


org.springframework.boot
spring-boot-starter-web



org.springframework.boot
spring-boot-starter-test
test


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
br/>@SpringBootApplication
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 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;
/**

10年积累的成都网站建设、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有新邵免费网站建设让你可以放心的选择与我们合作。

  • LoadBalancer客户端*/
    @Service
    br/>*/
    @Service
    br/>@Autowired

    @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 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
    br/>}
    @Override
    WeatherResponse weatherResponse = null;
    ServiceInstance serviceInstance = loadBalancer.choose("vis-basic-weather");
    String uri = serviceInstance.getUri().toString() + "/weather/cityName/" + cityName;
    // 调用服务接口来获取
    ResponseEntity 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;
    }
    function(){ //AxiTrader返佣:www.kaifx.cn/broker/axitrader.html@Override
    br/>@Override
    getDataByCities() {
    List cityList = null;
    ServiceInstance serviceInstance = loadBalancer.choose("vis-basic-city");
    String uri = serviceInstance.getUri().toString() + "/cities/getList";
    // 调用服务接口来获取
    ResponseEntity 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

    org.springframework.boot
    spring-boot-starter-parent
    2.1.7.RELEASE



    org.springframework.boot
    spring-boot-starter-actuator


    org.springframework.cloud
    spring-cloud



    com.alibaba
    fastjson
    1.2.47


    org.springframework.boot
    spring-boot-starter-thymeleaf


    org.springframework.cloud
    spring-cloud-starter-netflix-ribbon


    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-test
    test


    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
    br/>@SpringBootApplication
    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
    br/>@Configuration
    br/>@Autowired
    br/>@Bean
    public RestTemplate restTemplate() {
    return builder.build();}
    }
    @LoadBalanced注解表明这个restRemplate开启负载均衡的功能,用LoadBalancerClient配置,并且会替换URL中的服务名称为具体的IP地址
    br/>}
    }
    @LoadBalanced注解表明这个restRemplate开启负载均衡的功能,用LoadBalancerClient配置,并且会替换URL中的服务名称为具体的IP地址
    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 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
    br/>*/
    @Service
    br/>@Autowired
    private RestTemplate restTemplate;

    @Override
    public WeatherResponse getDataByCityId(String cityId) {
    WeatherResponse weatherResponse = null;
    String uri = "http://vis-basic-weather/weather/cityId/" + cityId;
    // 调用服务接口来获取
    ResponseEntity 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
    br/>}
    @Override
    WeatherResponse weatherResponse = null;
    String uri = "http://vis-basic-weather/weather/cityName/" + cityName;
    // 调用服务接口来获取
    ResponseEntity 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
    br/>}
    @Override
    getDataByCities() {
    List cityList = null;
    String uri = "http://vis-basic-city/cities/getList";
    // 调用服务接口来获取
    ResponseEntity 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服务消费有哪几种方式?
文章来源:http://hbruida.cn/article/gjhdsc.html