Java高并发处理机制

简介: Java高并发处理机制

高并发处理的思路:


  • 扩容:水平扩容、垂直扩容
  • 缓存:将基础的数据放入缓存进行处理
  • 使用SpringCloud的注册中心,分服务注册到同一个注册中心,服务器检测使用Spring的熔断操作,检测服务器的心跳那个正常随机跳转到正常的服务器上

也可以使用熔断机制通过实现Hystrix会监测微服务间调用的状况,当失败的调用到一定阈值缺省是5秒内20次调用失败,就会启用熔断机制


熔断机制的注解是@HystrixCommand ,Hystrix会找到有这个的注解,并将这类方法关联到和熔断器连在一起的代理上,@HystrixCommand仅当类的注解为@Service和@Component时才会发挥作用。


微服务之间的调用有两种方式,一种是一个是RestTemplate,另一个是Feign。相对应,在这两种调用方式下,都有Hystrix调用方法


  • 数据量大的在数据库做集成处理

对于微服务项目开发中,多个微服务之间不仅是相对独立的,而且也是相对关联的。也就是说,微服务之间需要相互访问,多个微服务之间的接口可能会被互相调用多次,我们称之为微服务之间的通信。


  • 微服务之间的通信方式有很多种, 一般都是使用RestTemplate 或者Feign

RestTemplate,是Spring中方便使用rest资源的一个对象,交互访问的资源通过URL进行识别和定位。每次调用都使用模板方法的设计模式,模板方法依赖于具体的接口调用,从而实现了资源交互和调用。它的交互方法有30多种,大多数都是基于HTTP的方法,


例如:delete(),getForEntity(),getForObject(),put(),headForHeaders()

添加对应依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

启动添加负载均衡标识

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

服务提供类,服务名称:SERVICE1,端口:7082

@RestController
@RequestMapping("/service1")
public class TestController {
    
  @RequestMapping(value = "test", method = {RequestMethod.POST,RequestMethod.GET})
  public String testService(@RequestParam(value = "testParam") String testParam) {
    System.println.out(testParam);
    return "success";
  }
    
}

服务消费类

@RestController
@RequestMapping("/serviceFront")
public class ServiceFrontController {
 
  private final static String SERVICE1_URL = "http://SERVICE1:7082";
 
  private final static String SERVICE1 = "SERVICE1";
 
  @Autowired  
  LoadBalancerClient loadBalancerClient;
 
  @Autowired
  RestTemplate restTemplate;
 
  @RequestMapping(value = "testFront", method = RequestMethod.POST)
  public HashMap<String,Object> testFront(@RequestParam String testParam) {
    this.loadBalancerClient.choose(SERVICE1);// 随机访问策略
    String result = restTemplate.getForObject(SERVICE1_URL + "/service1/test?testParam={1}", String.class, testParam);
    HashMap<String,Object> map = new HashMap<String,Object>();
    map.put("result", "测试结果!"+result);
    return map;
  }
}

RestTemplate发送post请求,主要的参数有如下几种


  • String url : 请求的路径
  • Object request:请求体【@RequestBody 注解接收】,或者是一个HttpEntity对象(包含请求参数,请求头)
  • Class< T> responseType:接收返回数据的类型
  • Map<String,?> uriVariables: uri 变量, 这是放置变量的地方
  • Object… uriVariables:可变长 Object 类型 参数
restTemplate.postForObject("http://XXXXXXXX?name={name}&age={age}", request, JSONObject.class, name,age);

Feign,是声明式的伪HTTP客户端,使得编写HTTP客户端更新容易,只需要创建一个接口,并且使用注解的方式去配置,即可完成对服务提供方接口的绑定,大大简化了代码量,同时它还具有可拔插的注解特性,而且支持feign自定义的注解和springMvc的注解。

添加具体的Feign依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

在启动类Application添加feign注解,声明启动feign客户端

@EnableFeignClients

服务提供类,服务名称:SERVICE2 端口7083

@RestController
@RequestMapping("/service2")
public class TestController{
  
  @RequestMapping(value = "test2", method = {RequestMethod.POST,RequestMethod.GET})
  public String test2(@RequestParam(value = "testParam2") String testParam2) {
    System.println.out(testParam2);
    return "success";
  }
  
}

服务消费接口类

@FeignClient(name = "SERVICE2")
public interface TestFeignClient { 
  
  @RequestMapping(value="/service2/test2",method = RequestMethod.GET)
  public String test2(@RequestParam("testParam2") String testParam2);
    
}

服务消费控制层

@RestController
@RefreshScope
@RequestMapping("/serviceFront2")
public class TestFeignController {
  
  @Autowired
  private TestFeignClient testFeignClient;
 
  @RequestMapping(value = "test2", method = { RequestMethod.POST })
  public HashMap<String,Object> test2(@RequestParam String testParam2) {    
    String result = testFeignClient.test2(testParam2);
    HashMap<String,Object> map = new HashMap<String,Object>();
    map.put("result", "测试结果!"+result);
    return map;
  }
}

总之,微服务之间的通讯方式可以多种并存,各有优势,在项目实践中可具体情况具体分析

目录
相关文章
|
4天前
|
网络协议 Java 应用服务中间件
深入浅出Tomcat网络通信的高并发处理机制
【10月更文挑战第3天】本文详细解析了Tomcat在处理高并发网络请求时的机制,重点关注了其三种不同的IO模型:NioEndPoint、Nio2EndPoint 和 AprEndPoint。NioEndPoint 采用多路复用模型,通过 Acceptor 接收连接、Poller 监听事件及 Executor 处理请求;Nio2EndPoint 则使用 AIO 异步模型,通过回调函数处理连接和数据就绪事件;AprEndPoint 通过 JNI 调用本地库实现高性能,但已在 Tomcat 10 中弃用
深入浅出Tomcat网络通信的高并发处理机制
|
2天前
|
存储 监控 算法
Java中的内存管理:理解Garbage Collection机制
本文将深入探讨Java编程语言中的内存管理,着重介绍垃圾回收(Garbage Collection, GC)机制。通过阐述GC的工作原理、常见算法及其在Java中的应用,帮助读者提高程序的性能和稳定性。我们将从基本原理出发,逐步深入到调优实践,为开发者提供一套系统的理解和优化Java应用中内存管理的方法。
|
4天前
|
Java 开发者
Java中的异常处理机制:理解与应用
在Java编程中,异常处理是一个重要的概念。它允许开发者通过检测和响应错误情况来增强程序的健壮性和可靠性。本文将深入探讨Java异常处理的基本概念、不同类型的异常以及如何使用try-catch-finally块来捕获和处理异常。我们还将讨论如何创建自定义异常类,并提供一些最佳实践来有效处理异常。通过阅读本文,您将能够更好地理解和应用Java中的异常处理机制,从而提高您的编程技能和代码质量。
|
3天前
|
Java 数据库连接 开发者
深入理解Java中的异常处理机制
本文旨在全面解析Java异常处理机制,从基础概念到高级应用,为读者提供一套完整的异常处理策略。通过实例演示,我们将揭示如何有效利用try-catch-finally语句,以及throw和throws关键字,来构建健壮的Java应用程序。此外,本文还将探讨自定义异常的创建与使用,以及如何通过合理的异常处理提升代码的可维护性和可读性。
|
4天前
|
Java 程序员 编译器
深入理解Java中的异常处理机制
本文旨在深入探讨Java的异常处理机制,揭示其在软件开发过程中的重要性。通过详细解析Java异常的类型、异常处理的方式以及自定义异常的方法,我们将了解如何有效利用异常处理机制来提高代码的健壮性和可维护性。此外,文章还将讨论常见的异常处理最佳实践和陷阱,帮助开发者在编写高质量Java应用时避免常见错误。
|
1天前
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
5 0
|
2天前
|
Java 数据库连接 开发者
探索Java中的异常处理机制
【10月更文挑战第6天】在Java编程的世界中,异常处理是一块重要的基石。它不仅保护了程序的稳定运行,还为开发者提供了调试信息和错误处理的途径。本文将深入探讨Java的异常处理机制,从基础的try-catch语句到高级的自定义异常类,带你了解如何在代码中妥善地管理和利用异常。
|
4天前
|
消息中间件 前端开发 Java
java高并发场景RabbitMQ的使用
java高并发场景RabbitMQ的使用
20 0
|
4天前
|
IDE Java 编译器
java反射机制原理
java反射机制原理
15 0
|
4月前
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
438 0