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

相关推荐
孟意昶4 小时前
Doris专题31-SQL手册-基础元素
大数据·数据库·数据仓库·分布式·sql·知识图谱·doris
2603_954708316 小时前
交直流混合微电网架构:拓扑优化与功率交互设计
人工智能·分布式·物联网·架构·系统架构·能源
juniperhan8 小时前
Flink 系列第12篇:Flink 维表关联详解
大数据·数据仓库·分布式·flink
Evand J10 小时前
【雷达跟踪代码介绍】基于matlab卡尔曼滤波器雷达多目标跟踪(双雷达 多目标 分布式融合)
分布式·matlab·目标跟踪·多目标跟踪·雷达跟踪
zz07232012 小时前
Seata ——微服务分布式事务
分布式·微服务·架构·seata
小江的记录本12 小时前
【分布式】分布式系统核心知识体系:CAP定理、BASE理论与核心挑战
java·前端·网络·分布式·后端·python·安全
Roselind_Yi13 小时前
云计算实验实操|Hadoop伪分布式部署+MapReduce编程实践(超详细图文版)
大数据·hadoop·经验分享·笔记·分布式·数据挖掘·云计算
是垚不是土13 小时前
Kafka 故障排查周期长?试试 Kdoctor
linux·运维·分布式·ai·kafka·运维开发
小江的记录本13 小时前
【分布式】分布式一致性协议:2PC/3PC、Paxos、Raft、ZAB 核心原理、区别(2026必考Raft)
java·前端·分布式·后端·安全·面试·系统架构
小江的记录本16 小时前
【分布式】分布式核心组件——分布式锁:Redis/ZooKeeper/etcd 实现方案(附全方位对比表)、优缺点、Redlock、时钟回拨问题
java·网络·redis·分布式·后端·zookeeper·架构