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

相关推荐
岁岁种桃花儿10 小时前
Kafka从入门到上天系列第三篇:基础架构推演+基础组件图形推演
分布式·kafka
qq_124987075321 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
Coder_Boy_1 天前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
袁煦丞 cpolar内网穿透实验室1 天前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
人间打气筒(Ada)1 天前
GlusterFS实现KVM高可用及热迁移
分布式·虚拟化·kvm·高可用·glusterfs·热迁移
xu_yule1 天前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
難釋懷1 天前
分布式锁的原子性问题
分布式
ai_xiaogui1 天前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
凯子坚持 c1 天前
如何基于 CANN 原生能力,构建一个支持 QoS 感知的 LLM 推理调度器
分布式