依赖无法下载或加载?(本地库冲突,网络不好,maven镜像配置,指定版本在远程服务器不存在,清idea缓存后重启)
项目的pom.xml文件有删除线?(idea/setting/build,Execution,Deployment/build Tools/maven/ignore Files)
练习一:公共工程设计及实现
第一步:创建01-sca工程的子工程,工程模块名sca-common,例如:
第二步:在sca-common模块工程中创建一个工具类com.jt.common.util.StringUtils,并在类中添加一个判断字符串是否为空的静态方法。
package com.jt.common.util;
public class StringUtils {
/**
* 通过此方法判定传入的字符串是否为空
* @param str
* @return
*/
public static boolean isEmpty(String str){
return str==null||"".equals(str);
}
}
第三步:将sca-common工程以依赖的方式添加到sca-provider工程中?
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.jtgroupId>
<artifactId>sca-commonartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>
第四步:在sca-provider工程中添加一个springboot启动类,类名为com.jt.ProviderApplication
package com.jt;
import com.jt.common.cache.DefaultCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class ProviderApplication{
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
第五步:在sca-provider工程中写一个单元测试类,类全名为com.jt.util.StringTests,并添加单元测试方法,在这个单元测试方法中使用sca-common工程中写的StringUtils类,测试一个字符串是否为空.
package com.jt.util;
import com.jt.common.util.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class StringTests {
@Test //org.junit.jupiter.api.Test
void testStringEmpty(){
String str="";
boolean empty = StringUtils.isEmpty(str);
System.out.println(empty);
}
}
练习二:熟悉工程中对象的管理以及测试
第一步:在sca-common工程中定义一个com.jt.common.cache.DefaultCache类型.
package com.jt.common.cache;
public class DefaultCache {
}
第二步:在sca-provider工程将DefaultCache类型的对象交给spring管理,写到启动类即可。
package com.jt;
import com.jt.common.cache.DefaultCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class ProviderApplication{
@Bean
public DefaultCache defaultCache(){
//将DefaultCache对象交给spring管理
return new DefaultCache();
}
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
第三步:在sca-provider工程中定义个单元测试类DefaultCache,并且在类中定义一个
单元测试方法,输出DefaultCache对象的toString方法的返回值。
package com.jt.util;
import com.jt.common.cache.DefaultCache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class DefaultCacheTests {
@Autowired //DI
private DefaultCache defaultCache;
@Test
void testDefaultCache(){
System.out.println(defaultCache.toString());
}
}
JAVA_HOME环境变量定义错误,例如:
说明,这里一定要注意JAVA_HOME单词的拼写,JAVA_HOME中定义的JDK是存在的,还有后面的路径不能有分号“;”.
MySQL版本比较低(建议mysql5.7或mariadb10.5及以上版本),例如:
当执行nacos-mysql.sql文件时,出现如下错误:
SQL文件应用错误,例如:
Nacos的application.properties配置文件中,连接数据库的配置错误.
服务注册时,服务名不正确,格式不正确,配置文件名字不正确,或者没有配置文件,例如:
基于Nacos实现服务注册失败,例如
客户端500异常,例如
服务调用时,连接异常,例如:
服务调用时底层404问题,例如:
sca-provider: #这个是要进行远程调用的服务id(服务名)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法
对于方案1写法,在写的过程没有提示,缩写编写苦难,但是将来的可运维性会比较好,我们这部分配置写到配置中心,不需要重启服务即可实现配置的动态发布,动态更新。
方案2:修改sca-consumer的启动类,在启动类中添加如下方法,例如:
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
对于方案2的写法,编写相对简单,编写过程都有提示,但是将来的可运维性比较差,项目打包以后,我们无法再修改
负载均衡算法。
feign:
hystrix:
enabled: false #false,true表示启动超时熔断机制
client:
config:
default: #表示所有服务均采用此配置,也可以指定具体服务名(remoteProviderService)。
connectTimeout: 20000 #连接超时
readTimeout: 20000 #读取数据超时
第一步:构建一个简易tomcat对象(了解)
package com.jt.common.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 通过java代码实现一个简易Tomcat对象
*/
public class Tomcat {
public static void main(String[] args) throws IOException {
//1.构建一个ServerSocket对象(java网络编程中的服务对象),并在指定端口进行监听
ServerSocket server=new ServerSocket(9000);
System.out.println("server start ...");
//2.等待客户端连接(可以循环处理多个客户端的请求)
while(true){
Socket client = server.accept();//阻塞式方法
OutputStream out = client.getOutputStream();
//基于http协议格式构建响应数据
byte[] data=("HTTP/1.1 200 OK \n\r" +
"Content-Type: text/html;charset=utf-8 \n\r" +
"\n\r" +
"hello client").getBytes();
out.write(data);
out.flush();
}//http
}
}
第二步:构建一个简易Browser对象,例如
package com.jt.common.net;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
/**
* 模拟浏览器
*/
public class Browser {
public static void main(String[] args) throws IOException {
//1.构建网络客户端对象Socket,并通过此对象对远端服务进行连接
Socket socket=new Socket("127.0.0.1", 9000);
//2.获取流对象
InputStream in = socket.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println("server say:"+new String(buf,0,len));
//3.释放资源
socket.close();
}
}
第三步:启动tomcat服务,Browser服务进行访问测试分析。