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

相关推荐
小坏讲微服务2 小时前
Spring Cloud Alibaba整合 Kafka 的完整实现
分布式·spring cloud·kafka·消息队列·springboot·linq
zl9798993 小时前
RabbitMQ-延迟队列
分布式·rabbitmq
-大头.4 小时前
深入解析ZooKeeper核心机制
分布式·zookeeper·wpf
s***4537 小时前
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置
windows·分布式·rabbitmq
jinxinyuuuus7 小时前
Info Flow:分布式信息采集、数据去重与内容分级的工程实现
人工智能·分布式·程序人生·生活
WHFENGHE20 小时前
输电线路分布式故障定位在线监测装置:技术解析与实际应用价值
分布式
BD_Marathon1 天前
【Kafka】
分布式·kafka
FinTech老王1 天前
集中式 vs 分布式数据库:金融用户如何选择?——金仓数据库的双架构实践与选型指南
数据库·分布式·金融
Roye_ack1 天前
【黑马点评 - 高级篇】Redis分布式缓存原理(Redis持久化 RDB AOF + 主从集群 哨兵 分片集群 + 多级缓存)
redis·分布式·缓存·aof·redis持久化·rdb·redis主从哨兵分片集群
b***59431 天前
分布式WEB应用中会话管理的变迁之路
前端·分布式