远程调用 | OpenFeign+LoadBalanced的使用

目录

[RestTemplate 注入](#RestTemplate 注入)

[OpenFeign 服务](#OpenFeign 服务)

[LoadBalanced 服务](#LoadBalanced 服务)

[LoadBalanced 注解](#LoadBalanced 注解)



RestTemplate 注入

创建 配置类,这里配置后 就不用再重新new一个了,而是直接调用即可

java 复制代码
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 UserConfig {

    @LoadBalanced
    @Bean
    public  RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

OpenFeign 服务

java 复制代码
import com.jkglxt.healthRecodr.entity.HealthRecord;
import com.jkglxt.users.entity.User;
import com.jkglxt.users.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    DiscoveryClient discoveryClient;
    @Autowired
    RestTemplate restTemplate;
  

    @Override
    public User createUser(int userId, int healthRecordId) {
        HealthRecord remoteHealthRecord = getRemoteHealthRecordWithLoadBalancerAnnotation(healthRecordId);

        if (userId == 0 || healthRecordId == 0){
            return null;
        }
        // 保存用户信息
        User user = new User();
        user.setUserId(userId);
        user.setHealthRecordId(healthRecordId);
        user.setPassword("password");
        user.setUsername("username");
        // TODO: 远程查询用户健康信息
        user.setUserHealthRecord(Arrays.asList(remoteHealthRecord));
        System.out.println("保存用户信息:" + user.toString());
        return user;
    }

    // 获取远程健康信息
    private HealthRecord getRemoteHealthRecord(int healthRecordId) {
        // 1. 获取健康信息服务的所有机器IP地址+端口号
        List<ServiceInstance> instances = discoveryClient.getInstances("service-health-record");

        ServiceInstance serviceInstance = instances.get(0);


        // 2.编辑调用健康信息服务Url
        String url = "http://" + serviceInstance.getHost()+":"+serviceInstance.getPort()+"/health/"+healthRecordId;

        log.info("远程健康信息服务Url:{}", url);
        // 3.给远程发送请求,获取健康信息
//        RestTemplate restTemplate = new RestTemplate();
        HealthRecord healthRecord = restTemplate.getForObject(url, HealthRecord.class);
        return healthRecord;
    }

}

LoadBalanced 服务

java 复制代码
import com.jkglxt.healthRecodr.entity.HealthRecord;
import com.jkglxt.users.entity.User;
import com.jkglxt.users.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements UserService {

 
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    LoadBalancerClient loadBalancerClient;

    @Override
    public User createUser(int userId, int healthRecordId) {
        HealthRecord remoteHealthRecord = getRemoteHealthRecordWithLoadBalancerAnnotation(healthRecordId);

        if (userId == 0 || healthRecordId == 0){
            return null;
        }
        // 保存用户信息
        User user = new User();
        user.setUserId(userId);
        user.setHealthRecordId(healthRecordId);
        user.setPassword("password");
        user.setUsername("username");
        // TODO: 远程查询用户健康信息
        user.setUserHealthRecord(Arrays.asList(remoteHealthRecord));
        System.out.println("保存用户信息:" + user.toString());
        return user;
    }


    // 获取远程健康信息 负载均衡
    private HealthRecord getRemoteHealthRecordWithLoadBalancer(int healthRecordId) {
        // 1. 获取健康信息服务的所有机器IP地址+端口号
        ServiceInstance choose = loadBalancerClient.choose("service-health-record");

             // 2.编辑调用健康信息服务Url
        String url = "http://" + choose.getHost()+":"+choose.getPort()+"/health/"+healthRecordId;

        log.info("远程健康信息服务Url:{}", url);
        // 3.给远程发送请求,获取健康信息
        HealthRecord healthRecord = restTemplate.getForObject(url, HealthRecord.class);
        return healthRecord;
    }

}

LoadBalanced 注解

java 复制代码
import com.jkglxt.healthRecodr.entity.HealthRecord;
import com.jkglxt.users.entity.User;
import com.jkglxt.users.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements UserService {

   
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    LoadBalancerClient loadBalancerClient;

    @Override
    public User createUser(int userId, int healthRecordId) {
        HealthRecord remoteHealthRecord = getRemoteHealthRecordWithLoadBalancerAnnotation(healthRecordId);

        if (userId == 0 || healthRecordId == 0){
            return null;
        }
        // 保存用户信息
        User user = new User();
        user.setUserId(userId);
        user.setHealthRecordId(healthRecordId);
        user.setPassword("password");
        user.setUsername("username");
        // TODO: 远程查询用户健康信息
        user.setUserHealthRecord(Arrays.asList(remoteHealthRecord));
        System.out.println("保存用户信息:" + user.toString());
        return user;
    }
    

    // 获取远程健康信息 负载均衡 注释
    private HealthRecord getRemoteHealthRecordWithLoadBalancerAnnotation(int healthRecordId) {
        // 1. 获取健康信息服务的所有机器IP地址+端口号
        String url = "http://service-health-record/health/"+healthRecordId;

        log.info("远程健康信息服务Url:{}", url);
        // 3.给远程发送请求,获取健康信息
        HealthRecord healthRecord = restTemplate.getForObject(url, HealthRecord.class);
        return healthRecord;
    }
}

-- Thank you --

相关推荐
武子康1 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
itLaity6 小时前
基于Kafka实现简单的延时队列
spring boot·分布式·kafka
qq_529835356 小时前
Zookeeper的简单了解
分布式·zookeeper·云原生
smileNicky7 小时前
RabbitMQ有多少种Exchange?
分布式·rabbitmq
你我约定有三8 小时前
RabbitMQ--消息丢失问题及解决
java·开发语言·分布式·后端·rabbitmq·ruby
Java初学者小白8 小时前
秋招Day19 - 分布式 - 分布式事务
java·分布式
程序员小羊!10 小时前
Zookeeper 3.6.3【详细技术讲解】整
分布式·zookeeper·云原生
是2的10次方啊12 小时前
微信公众号阅读量为什么会不一致?一文读懂分布式系统的那些事儿
分布式
Rancemy1 天前
rabbitmq 03
java·分布式·rabbitmq
黄雪超1 天前
Kafka——多线程开发消费者实例
大数据·分布式·kafka