远程调用 | 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 --

相关推荐
小熊美家熊猫系统5 小时前
电子合同技术实现与合规实践
java·开发语言·分布式
AI 小老六7 小时前
Google AX 控制面拆解:分布式 Agent 如何把断点恢复、审计策略和执行调度收进同一条链路
人工智能·分布式·后端·ai·架构·ai编程
functionflux8 小时前
kafka-python:Python 生态中最成熟的 Kafka 客户端
分布式·python·其他·kafka
kyle~12 小时前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
q210306337212 小时前
kafka启动几秒后挂了,重启多次无果
分布式·kafka
凯源智能13 小时前
工商业分布式光伏箱变智能监控落地实战
分布式·箱变测控·光伏箱变测控装置·箱变监控系统·箱式变测控装置
沂水弦音13 小时前
软控 EI 系列模块优势与竞品对比分析:面向 EtherCAT 分布式 I/O 的工程选型视角
分布式·制造·工业自动化·ethercat·io模块
木心术114 小时前
在NVIDIA DGX Spark上部署NemoClaw的实际操作方案以及实际应用便利性。
大数据·分布式·spark
kuokay14 小时前
MLOps 与 AIOps 的核心概
人工智能·分布式·大模型·agent·llama
openFuyao15 小时前
openFuyao InferNex:云原生分布式 LLM 推理加速套件——从生产痛点到算力的极致释放
分布式·云原生·ai原生·openfuyao·多样化算力