spring-cloud 方法调用feign与dubbo

java项目中调用接口的方法

1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。

2)Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议(HTTP/2 和 SPDY)。

3)HttpURLConnection
HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。

4)RestTemplate WebClient
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便,它就是 Feign。

之前说的负载均衡器 可以帮我们去注册中心查找服务的ip跟端口 然后调用对应的接口 实现远程调用 但是我们还是需要在代码中写死服务名还会写大量的请求地址然后就 为了避免这些与业务不相关的代码出现在业务里 就有了feign与dubbo这两个框架了 使用feign或者dubbo框架 可以让我们在业务代码中直接使用对面点方法方式调用远程接口 比如 服务a是服务提供者 服务b是服务消费者也就是调用服务方 服务a中有user类 类中有a方法 a方法提供的接口是aa 如果没用feign或者dubbo框架 那么我们在服务b中要使用ribbon或LoadBalancer这种负载均衡去调用服务a中的接口 这就会写大量的请求地址 当我们使用了 feign或dubbo就可以直接在服务b中创建一个a接口 在a接口中写一个a方法 然后在业务层 使用@Autowired注解导入一个a实例 直接使用这个a的代理对象点a方法就可以完成远程调用 这样就很符合远程方法调用的意思了feign或dubbo给我们写好ribbon或LoadBalancer负载均衡

openfeign是spring-cloud官方封装的feign 在feign基础上加强了对mvc注解支持还给整合了ribbon

feign 是netflix开发

Ribbon&Feign对比Ribbon+RestTemplate进行微服务调用

RestTemplate调用方式

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

//调用方式
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);

Feign调用方式

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {
    @RequestMapping("/findOrderByUserId/{userId}")
    public R findOrderByUserId(@PathVariable("userId") Integer userId);
}

@Autowired
OrderFeignService orderFeignService;
//feign调用
R result = orderFeignService.findOrderByUserId(id);

Spring Cloud Alibaba快速整合Feign

引入依赖



    org.springframework.cloud
    spring-cloud-starter-openfeign

编写调用接口+@FeignClient注解

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {

@RequestMapping("/findOrderByUserId/{userId}")
public R findOrderByUserId(@PathVariable("userId") Integer userId);
}

调用端启动类

@SpringBootApplication
@EnableFeignClients
public class MallUserFeignDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MallUserFeignDemoApplication.class, args);
    }
}

发起调用

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    OrderFeignService orderFeignService;

    @RequestMapping(value = "/findOrderByUserId/{id}")
    public R  findOrderByUserId(@PathVariable("id") Integer id) {
        //feign调用
        R result = orderFeignService.findOrderByUserId(id);
        return result;
    }
}

@Autowired
OrderFeignService orderFeignService;
这里在生成代理对象的时候会根据 @FeignClient(value = “mall-order”,path = “/order”)、 @RequestMapping("/findOrderByUserId/{userId}")这些注解去注册中心查找 然后给它创建一个实现了findOrderByUserId方法的代理对象 比如给这个方法中写了HttpURLConnection类型调用请求的逻辑

在yml文件中配置

cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848 # 配置注册中心的地址就可以使用

扩展点
RequestInterceptor它的appy方法 可以得到当前请求

spring-cloud整合dubbo

provider服务提供者


    com.alibaba.cloud
    spring-cloud-starter-dubbo



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

application.yml

dubbo:
  scan:
    # 指定 Dubbo 服务实现类的扫描基准包
    base-packages: com.tuling.mall.user.service
#  application:
#    name: ${spring.application.name}
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: -1
#  registry: 如果这里使用nacos作为注册中心 dubbo会注册的很乱 不好看
#    #挂载到 Spring Cloud 注册中心  高版本可选 这里配置跟下面cloud配置的nacos一样 
#    address: spring-cloud://127.0.0.1:8848

spring:
  application:
    name: spring-cloud-dubbo-provider-user
  main:
    # Spring Boot2.1及更高的版本需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848

@DubboService注解表示暴露服务

@DubboService
public class UserServiceImpl implements UserService {

   @Autowired
   private UserMapper userMapper;

   @Override
   public List list() {
      return userMapper.list();
   }

   @Override
   public User getById(Integer id) {
      return userMapper.getById(id);
   }
}

consumer消费端配置

引入依赖


    org.springframework.boot
    spring-boot-starter-web



    com.alibaba.cloud
    spring-cloud-starter-dubbo



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

application.yml

dubbo:
  cloud:
    # 指定需要订阅的服务提供方,默认值*,会订阅所有服务,不建议使用
    subscribed-services: spring-cloud-dubbo-provider-user
#  application:
#    name: ${spring.application.name}
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: -1
#  registry:
#    #挂载到 Spring Cloud 注册中心  高版本可选
#    address: spring-cloud://127.0.0.1:8848

spring:
  application:
    name: spring-cloud-dubbo-consumer-user
  main:
    # Spring Boot2.1及更高的版本需要设定
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # Nacos 服务发现与注册配置
      discovery:
        server-addr: 127.0.0.1:8848

服务消费方通过@DubboReference引入服务

@RestController
@RequestMapping("/user")
public class UserConstroller {

@DubboReference
private UserService userService;

@RequestMapping("/info/{id}")
public User info(@PathVariable("id") Integer id){

    return userService.getById(id);
}

@RequestMapping("/list")
public List list(){

    return userService.list();
}
}

你可能感兴趣的:(个人学习,spring,cloud,dubbo,1024程序员节)