目录
本地
public interface ServiceProvider {
<T> void register(T service);
Object getService(String serviceName);
}
import lombok.extern.slf4j.Slf4j;
import registery.ServiceProvider;
import util.ClassUtils;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class DefaultServiceProvider implements ServiceProvider {
private static final Map<String, Object> serviceMap = new ConcurrentHashMap<>();
private static final Set<String> registeredServices = ConcurrentHashMap.newKeySet();
private static final Set<String> services = Collections.unmodifiableSet(new HashSet<>() {
{
for (Class<?> serviceInterface :
Objects.requireNonNull(ClassUtils.getClassByPackage())) {
add(serviceInterface.getSimpleName());
}
}
});
public DefaultServiceProvider() {
}
// TODO: 2022/8/4 应用锁接口
@Override
public synchronized <T> void register(T service) {
String serviceName = service.getClass().getSimpleName();
if (registeredServices.contains(serviceName)){
log.info("服务已注册");
return;
}
Class<?>[] interfaces = service.getClass().getInterfaces();
if (interfaces.length == 0) {
log.error("服务未实现任何接口");
return;
}
// Class<?>/var Class
Class<?>[] serviceInterfaces = new Class[interfaces.length];
int count=0;
for (Class<?> anInterface : interfaces) {
if (services.contains(anInterface.getSimpleName())) {
serviceInterfaces[count] = anInterface;
count++;
}
}
if (count==0) {
log.error("服务未实现任何服务接口");
return;
}
for (Class<?> serviceInterface : serviceInterfaces) {
String serviceInterfaceSimpleName = serviceInterface.getSimpleName();
serviceMap.put(serviceInterfaceSimpleName, service);
registeredServices.add(serviceInterfaceSimpleName);
}
}
@Override
public synchronized Object getService(String serviceName) {
Object o = serviceMap.get(serviceName);
if (o==null) {
log.error("该服务未注册/服务未发现");
return null;
}
return o;
}
public void print() {
System.out.println(serviceMap.toString());
System.out.println(registeredServices.toString());
}
}
Nacos
import java.net.InetSocketAddress;
public interface ServiceRegistry {
void register(String serviceName, InetSocketAddress inetSocketAddress);
InetSocketAddress lookupService(String serviceName);
}
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import lombok.extern.slf4j.Slf4j;
import registery.ServiceRegistry;
import java.net.InetSocketAddress;
import java.util.List;
@Slf4j
public class NacosServiceRegistry implements ServiceRegistry {
private static final String SERVER_ADD = "43.138.34.94:8848";
private static final NamingService namingService;
static {
try {
namingService = NamingFactory.createNamingService(SERVER_ADD);
} catch (NacosException e) {
log.error("connect nacos fail");
throw new RuntimeException(e);
}
}
@Override
public void register(String serviceName, InetSocketAddress inetSocketAddress) {
try {
namingService.registerInstance(serviceName, inetSocketAddress.getHostName(),inetSocketAddress.getPort());
} catch (NacosException e) {
log.error("注册服务失败", e);
}
}
@Override
public InetSocketAddress lookupService(String serviceName) {
try {
List<Instance> allInstances = namingService.getAllInstances(serviceName);
Instance instance = allInstances.get(0);
return new InetSocketAddress(instance.getIp(), instance.getPort());
} catch (NacosException e) {
log.error("find service fail");
}
return null;
}
}