1. 필요 플러그인
    1. build user vars(링크)
  2. 사용 방법
    1. 빌드 환경에서 "Set jenkins user build variables" 활성화
    2. 이후 변수 접근해서 사용 가능
    3. 예)

 

 

 

 

 

 

 

spring webflux의 websocket관련 소스 분석

 

 

 

  1. WebSocketSession

    1. 인터페이스

    2. 용도/목적

  2. WebSocketHandler

 

 

netty 스레드 확인

 

 

  1. 구성 후 서버(netty)를 시작 후 thread를 확인해보면 reactor-http-nio-x 스레드를 확인할 수 있음

    1. netty 기본 설정에 의해 스레드 갯수는 CPU코어 갯수만큼 생김

    2. 아래 그림은 JMC(Oracle Java Mission Control)로 확인한 내용

       

 

 

  1. 아래 그림은 로컬PC 의 CPU 코어 갯수

 

 

 

주변분이 추천해주셔서 사용 중인 화면 캡쳐 프로그램인데 매우 만족.
 - getsharex.com/

ShareX - Screen capture, file sharing and productivity tool

ShareX is a free and open source program that lets you capture or record any area of your screen and share it with a single press of a key. It also allows uploading images, text or other types of files to many supported destinations you can choose from.

getsharex.com

 
 

참고

 - https://aws.amazon.com/ko/blogs/database/optimize-redis-client-performance-for-amazon-elasticache/

 - https://aws.amazon.com/ko/blogs/database/best-practices-redis-clients-and-amazon-elasticache-for-redis/

 

 - https://github.com/lettuce-io/lettuce-core/wiki/Connection-Pooling

 - https://lettuce.io/core/release/reference/#connection-pooling.is-connection-pooling-necessary

  1. 필요 라이브러리
    1. maven dependency 추가
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.3.3.RELEASE</version>
</dependency>


<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.8.1</version>
</dependency>

 

2. 샘플 소스 - java

 - async command 등 참고 링크

import io.lettuce.core.ClientOptions;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisConnectionException;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
import io.lettuce.core.support.ConnectionPoolSupport;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

/**
 * redis 커넥션풀 기반 연결 샘플
 *
 * @author 
 */
public class ConnectionSampleWithPool {

	private static final String REDIS_CON_URL = "redis://192.168.56.1:6379/0"; //로컬 redis 0번 사용
	public static GenericObjectPool<StatefulRedisConnection<String, String>> pool = null; //sync & 비 클러스터모드 커넥션풀

	public static void main(String[] args) throws InterruptedException {

		pool = nonClusterPoolUsage();
		//pool = useClusterPoolUsage(); //클러스터모드일때

		testSetValue("key-pool-test-1", "key-pool-test-1");
		testSetValue("key-pool-test-2", "key-pool-test-2");
		testSetValue("key-pool-test-3", "key-pool-test-3");

		Thread.sleep(10 * 1000); //커넥션풀 close 전에 대기 후, redis-cli(서버)에서 client list 명령어로 현재 연결된 클라이언트 리스트를 확인해보면 됨

		pool.close();
		System.out.println("finish");
	}

	/**
	 * set value 테스트
	 *
	 * @param key
	 * @param value
	 */
	private static void testSetValue(String key, String value) {

		try (StatefulRedisConnection<String, String> connection = pool.borrowObject()) { //pool을 이용해서 커맨드 실행
			connection.sync().set(key, value);
			value = connection.sync().get(key);
			System.out.println(value);
		} catch (RedisConnectionException e) {
			System.out.println(String.format("Failed to connect to Redis server: %s", e));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 비 클러스터 모드일때 커넥션풀 셋팅
	 *
	 * @return
	 */
	private static GenericObjectPool<StatefulRedisConnection<String, String>> nonClusterPoolUsage() {

		RedisClient client = RedisClient.create(REDIS_CON_URL);
		client.setOptions(ClientOptions.builder().autoReconnect(true).build());

		return ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), createPoolConfig());
	}

	/**
	 * 클러스터모드일때 커넥션 풀 셋팅
	 *  - 참고: https://github.com/Azure/azure-redis-cache-samples/blob/master/Java/ClientSamples/src/main/java/lettuce/PoolUsage.java
	 *
	 * @return
	 */
	private static GenericObjectPool<StatefulRedisClusterConnection<String, String>> useClusterPoolUsage() {

		RedisClusterClient clusterClient = RedisClusterClient.create(REDIS_CON_URL);
		clusterClient.setOptions(ClusterClientOptions.builder().autoReconnect(true).build());

		return ConnectionPoolSupport.createGenericObjectPool(() -> clusterClient.connect(), createPoolConfig());
	}

	/**
	 * 커넥션풀 설정 생성
	 *
	 * @return
	 */
	private static GenericObjectPoolConfig createPoolConfig() {

		GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

		poolConfig.setMaxTotal(20);
		poolConfig.setMaxIdle(10);

		// "true" will result better behavior when unexpected load hits in production
		// "false" makes it easier to debug when your maxTotal/minIdle/etc settings need adjusting.
		poolConfig.setBlockWhenExhausted(true);
		poolConfig.setMaxWaitMillis(1000);
		poolConfig.setMinIdle(5);

		return poolConfig;
	}

}

java 로컬캐시

 -Guava cache보다 좋음

- https://github.com/ben-manes/caffeine

그냥하면 에러가 발생하기에 수정이 필요함

-----

 

@ComponentScan(basePackages = {"com.biz"}, includeFilters = {@Filter(value = org.springframework.stereotype.Controller.class)})

//@EnableCaching /* 캐쉬관련 */

//@EnableWebMvc //2020-08-04 기준 spring-admin과 lombok 관련 문제로 EnableWebMvc 사용하면 안됨. 참고: https://github.com/codecentric/spring-boot-admin/issues/777

@Configuration

public class MvcConfiguration implements WebMvcConfigurer {

 

 

   /**

    * spring-admin client에게 요청시 http basic auth로 요청하기 위한 커스텀

    *  - 참고 basic auth 생성기: https://www.blitter.se/utils/basic-authentication-header-generator/

    *

    * @return

    */

   @Bean

   public HttpHeadersProvider customHttpHeadersProvider() {

      return instance -> {

         HttpHeaders httpHeaders = new HttpHeaders();

         httpHeaders.add("Authorization", " Basic 블라블라");

         return httpHeaders;

      };

   }

 

 

}

 

 

webflux 기반으로 고성능 어플리케이션 작업할게 있는데 model mapper관련 성능 메모

 - 참고로, 기본 리플렉션을 이용한 맵퍼는 CPU를 많이 사용함

 - https://www.baeldung.com/java-performance-mapping-frameworks를 참고해서 선정 필요

+ Recent posts