api
package com.test.api.dto;
import java.io.Serializable;
public class RsfResponseDto<T> implements Serializable {
private static final long serialVersionUID = -5779341775984708513L;
private boolean success;
private String errorCode;
private String errorMsg;
private T data;
public RsfResponseDto(){
this.setSuccess(true);
this.setErrorCode("0");
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return "RsfResponseDto{" +
"success=" + success +
", errorCode='" + errorCode + '\'' +
", errorMsg='" + errorMsg + '\'' +
", data=" + data +
'}';
}
}
package com.test.api.dto;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 5489453523619607703L;
private String id;
private String name;
private int age;
public User(String name, int age){
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.test.api.service;
import com.test.api.dto.RsfResponseDto;
import com.test.api.dto.User;
public interface DemoService {
RsfResponseDto<User> queryUserById(String userId);
}
producer
package com.test.producer.service.impl;
import com.test.api.dto.RsfResponseDto;
import com.test.api.dto.User;
import com.test.api.service.DemoService;
import com.test.rpc.annotation.Implement;
@Implement(contract = DemoService.class, impCode = "1.0.0")
public class DemoServiceImpl implements DemoService {
@Override
public RsfResponseDto<User> queryUserById(String userId) {
System.out.printf("服务提供方接收到请求:request parameter:{%s}\r\n", userId);
RsfResponseDto rsfResponseDto = new RsfResponseDto();
User user = new User("zhangsan", 28);
user.setId(userId);
rsfResponseDto.setData(user);
System.out.printf("服务提供方返回响应:response1.0:{%s}\r\n", rsfResponseDto);
return rsfResponseDto;
}
}
package com.test.producer.service.impl;
import com.test.api.dto.RsfResponseDto;
import com.test.api.dto.User;
import com.test.api.service.DemoService;
import com.test.rpc.annotation.Implement;
@Implement(contract = DemoService.class, impCode = "2.0.0")
public class DemoServiceImpl2 implements DemoService {
@Override
public RsfResponseDto<User> queryUserById(String userId) {
System.out.printf("服务提供方接收到请求:request parameter:{%s}\r\n", userId);
RsfResponseDto rsfResponseDto = new RsfResponseDto();
User user = new User("lisa", 35);
user.setId(userId);
rsfResponseDto.setData(user);
System.out.printf("服务提供方返回响应:response2.0:{%s}\r\n", rsfResponseDto);
return rsfResponseDto;
}
}
package com.test.producer.container;
import com.test.rpc.publish.Publisher;
import com.test.rpc.publish.PublisherWithZK;
import com.test.rpc.registry.Register;
import com.test.rpc.registry.impl.RegisterCenterImpl;
public class Main {
public static void main(String[] args) {
// 使用zookeeper作为注册中心
// publishWithZooKeeper();
// 不使用zookeeper作为注册中心
publishWithoutZooKeeper();
}
public static void publishWithZooKeeper(){
try {
String scanPackages = "com.test.producer.service";
Register register = new RegisterCenterImpl();
String serviceAddress = "127.0.0.1:8083";
new PublisherWithZK(register, serviceAddress).export(scanPackages);
} catch (Exception ex){
ex.printStackTrace();
}
}
public static void publishWithoutZooKeeper(){
try {
Publisher.export();
} catch (Exception ex){
ex.printStackTrace();
}
}
}
consumer
package com.test.consumer;
import com.test.api.dto.RsfResponseDto;
import com.test.api.dto.User;
import com.test.api.service.DemoService;
import com.test.rpc.discovery.proxy.impl.JDKProxyFactory;
import org.junit.Test;
public class Client {
/**
* 通过jdk动态代理调用远程方法
*/
@Test
public void clientCallByProxy() {
DemoService demoService = null;
try {
demoService = new JDKProxyFactory().getInstance(DemoService.class);
System.out.println("消费端发送请求,请求参数:id=1");
RsfResponseDto<User> userRsfResponseDto = demoService.queryUserById("1");
System.out.printf("消费端接收到响应:RsfResponseDto={%s}\r\n", userRsfResponseDto);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.test.consumer;
import com.test.api.dto.RsfResponseDto;
import com.test.api.dto.User;
import com.test.api.service.DemoService;
import com.test.rpc.discovery.servicelocator.ServiceLocator;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class ClientForZk {
/**
* 使用ServiceLocator 模式获取远程对象进行方法调用
*/
@Test
public void clientCallByServiceLocator() {
try {
DemoService demoService = (DemoService) ServiceLocator.getService(DemoService.class.getName(), "1.0.0", false);
System.out.printf("[%d]消费端发送请求,请求参数:id=1\r\n",Thread.currentThread().getId());
RsfResponseDto<User> userRsfResponseDto = demoService.queryUserById("1");
System.out.printf("[%d]消费端接收到响应:RsfResponseDto={%s}\r\n",Thread.currentThread().getId(), userRsfResponseDto);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 演示负载均衡处理
*/
@Test
public void showLoadBalance() {
int clientCount = 3;
for (int i = 0; i < clientCount; i++) {
clientCallByServiceLocator();
}
}
/**
* 客户端多线程并发调用
*/
@Test
public void multiThreadCall() {
//并发线程数量
int threadCount = 100;
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
new Thread(() -> {
try {
System.out.println("begin await");
countDownLatch.await();
System.out.println("end await");
clientCallByServiceLocator();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
countDownLatch.countDown();
}
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}