保定网站优化招聘,哪些公司可以做网站,服装网站建设策划,wordpress 当前列表数壹、零基础
一、微服务架构零基础理论入门
SpringCloud分布式微服务架构的一站式解决方案#xff0c;是多种微服务架构落地技术的集合体#xff0c;俗称微服务全家桶。 二、从2.2.x和H版开始说起
springboot版本选择#xff1a;
git源码地址#xff1a;https://github.… 壹、零基础
一、微服务架构零基础理论入门
SpringCloud分布式微服务架构的一站式解决方案是多种微服务架构落地技术的集合体俗称微服务全家桶。 二、从2.2.x和H版开始说起
springboot版本选择
git源码地址https://github.com/spring-projects/spring-boot/releases/
SpringBoot2.0新特性https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release
springcloud版本选择
git源码地址https://github.com/spring-projects/spring-cloud
官网https://spring.io/projects/spring-cloud
官网看cloud版本
springcloud和springboot之间依赖关系https://spring.io/projects/spring-cloud#overview 三、关于Cloud各种组件的停更/升级/替换
服务注册中序Eureka挂。zookeeper。Consul。Nacos百万级推荐。
服务调用1Ribbon。LoadBalancer。
服务调用2Feign挂。OpenFeign。
服务降级Hystrix挂。resilience4j。sentienl推荐。
服务网关Zuul挂。Zuul2未出。gateway推荐。
服务配置Config挂。Nacos推荐。
服务总线Bus挂。Nacos推荐。
参考资料
1. Spring Cloudhttps://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/
2. Spring Cloud中文文档https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md
3. Spring Boothttps://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/
四、微服务架构编码构建
4.1 引入依赖 !-- 统一管理jar包版本 --propertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.targetjunit.version4.12/junit.versionlog4j.version1.2.17/log4j.versionlombok.version1.16.18/lombok.versionmysql.version5.1.47/mysql.versiondruid.version1.1.16/druid.versionmybatis.spring.boot.version1.3.0/mybatis.spring.boot.version/properties
!-- 子模块继承之后提供作用锁定版本子modlue不用写groupId和version --dependencyManagementdependencies!--spring boot 2.2.2--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.2.2.RELEASE/versiontypepom/typescopeimport/scope/dependency!--spring cloud Hoxton.SR1--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversionHoxton.SR1/versiontypepom/typescopeimport/scope/dependency!--spring cloud alibaba 2.1.0.RELEASE--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2.1.0.RELEASE/versiontypepom/typescopeimport/scope/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion${druid.version}/version/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion${mybatis.spring.boot.version}/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion${junit.version}/version/dependencydependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion${log4j.version}/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/versionoptionaltrue/optional/dependency/dependencies/dependencyManagement
buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion2.2.1.RELEASE/versionconfigurationforktrue/forkaddResourcestrue/addResources/configuration/plugin/plugins/build
DependencyManagement和Dependencies的区别
DependencyManagement是父类定义的坐标版本号用在父工程类似于规范将全工程的版本统一只负责定义而不负责引入实现。真正引入依赖的是子类dependencies定义的版本号。如果子类没指定版本号默认是用父类的。如果子类指定了版本号则版本号用子类指定的如果不在子项目中声明依赖不会从父项目中继承。只要在子项目中写了该依赖项并且没有指定具体的版本才会从父项目中继承该项并且version和scope都读取自父pom。
maven中跳过单元测试 4.2 支付模块构建
1.建module右键项目新建Module 2.改POM
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.10/version/dependency!--mysql-connector-java--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependency!--jdbc--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency
/dependencies
3. 写YML
在cloud-provider-payment8001的resources下创建application.yml文件注意要变成绿色树叶
server:port: 8081spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2019?useUnicodetruecharacterEncodingutf-8usrSSLfalseusername: rootpassword: 111111mybatis:mapper-locations: classpath:mapper/*.xml #在mapper包下创建.xml配置文件type-aliases-package: com.atguigu.springcloud.entities #entities下创建实体类4. 主启动
在src/main/java/com/atguigu/springcloud包下创建PaymentMain8001类加上SpringBootApplication作为主启动类
SpringBootApplication
public class PaymentMain8001 {public static void main(String[] args){SpringApplication.run(PaymentMain8001.class,args);}
}
5. 业务类
5.1 建表SQL
CREATE TABLE payment(id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ID,serial varchar(200) DEFAULT ,PRIMARY KEY(id)
)ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8
5.2 entities实体类
在java/com/atguigu/springcloud下创建entities包在其下创建Payment类
主实体Payment代码
public class Payment implements Serializable {private Long id;private String serial;public Long getId() {return id;}public void setId(Long id) {this.id id;}public String getSerial() {return serial;}public void setSerial(String serial) {this.serial serial;}public Payment(Long id, String serial) {this.id id;this.serial serial;}public Payment() {}
}
Json封装体CommonResult
在entities包下创建CommonResult类
public class CommonResultT {private Integer code;private String message;private T data;public CommonResult(Integer code,String message){this(code,message,null);}public CommonResult(Integer code, String message, T data) {this.code code;this.message message;this.data data;}public CommonResult() {}public Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}public T getData() {return data;}public void setData(T data) {this.data data;}
}
1. Data是一个Lombok注解用于自动生成Java类的常见方法如getter、setter、toString、equals和hashCode方法。
2. this(code, message, null)表示调用当前类的另一个构造函数CommonResult(Integer code, String message, Object data)并传递参数code、message和null。
3. AllArgsConstructor是Lombok注解之一用于自动生成一个包含所有参数的构造函数。
5.3 dao
创建dao包在其下创建PaymentDao接口记得写Mapper注解
Mapper
public interface PaymentDao {public int create(Payment payment);public Payment getPaymentById(Param(id) Long id);
}
mybatis的映射文件
在resources下创建mapper包创建PaymentMapper.xml映射文件
1. parameterType是用来指定传入SQL语句的参数类型。
2. resultMap用来指定查询结果映射到哪个Java对象上。
3. column是数据库字段property是java对象属性。
4.keyProperty用于指定自动生成的主键值要被设置到Java实体类的哪个属性上。 resultMap映射属性用于防止命名不规范造成错误
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.atguigu.springcloud.dao.PaymentDaoinsert idcreate parameterTypePayment useGeneratedKeystrue keyPropertyidinsert into payment(serial) values(#{serial});/insertresultMap idBaseResultMap typecom.atguigu.springcloud.entities.Paymentid columnid propertyid jdbcTypeBIGINT/id columnserial propertyserial jdbcTypeVARCHAR//resultMapselect idgetPaymentById parameterTypeLong resultMapBaseResultMapselect * from payment where id#{id};/select
/mapper
5.4 service
在springcloud下创建service包创建PaymentService接口
public interface PaymentService{public int create(Payment payment);public Payment getPatmentById(Param(id) Long id);
}
1. Param注解的作用是给方法参数起别名Param注解的作用是给方法参数起别名。Param(id)表示给方法参数id起别名为id。这样在SQL映射文件中可以使用#{id}来引用这个参数。
创建PaymentServiceImpl实现类记得写Service注解
1. Resource注解是用来标记一个需要依赖注入的对象。可以根据名称进行依赖注入也可以根据类型进行依赖注入。
Service
public class PaymentServiceImpl implements PaymentService {Resourceprivate PaymentDao paymentDao;public int create(Payment payment) {return paymentDao.create(payment);}public Payment getPatmentById(Long id) {return paymentDao.getPaymentById(id);}
}
5.5 controller
在springcloud下创建controller包然后创建PaymentController类
1. GetMapping注解用于将HTTP的GET请求映射到相应的处理方法上。
2. PathVariable注解用于将URL路径中的变量值绑定到方法参数上。
RestController
public class PaymentController {Resourceprivate PaymentService paymentService;PostMapping(value/payment/create)public CommonResult create(Payment payment){System.out.println(payment.getSerial());int result paymentService.create(payment);if(result0){return new CommonResult(200,插入数据库成功,result);}else{return new CommonResult(444,插入数据库失败,null);}}GetMapping(value/payment/get/{id})public CommonResult getPaymentById(PathVariable(id) Long id){Payment payment paymentService.getPatmentById(id);if(payment ! null){return new CommonResult(200,查询成功,payment);}else{return new CommonResult(444,没有对应记录查询ID:id,null);}}
}
5.6 测试
启动启动类在地址栏输入localhost:8001/payment/get/31
浏览器不适合发post请求因此去postman发请求id是自增的只需要发送serial即可 4.3 热部署
Devtools热部署代码改动自动重启。
第1步在cloud-provider-payment8001添加依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional
/dependency 第2步父工程cloud2020添加插件 buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion2.2.1.RELEASE/versionconfigurationforktrue/forkaddResourcestrue/addResources/configuration/plugin/plugins/build
第3步开启自动编译权限 第4步更新值开启热注册 输入快捷键ctrl shift alt / 第5步重启
失败测试同样是PaymentMain8001启动然后进入到cloud-provider-payment8001下的controller,更改CommonResult为CommonResultPayment会实时刷新失败。 4.4 消费者订单模块
1. 建module
名字Cloud-consumer-order80src下有main和testmain下有java和resource 2. 改pom
web、acuator是图形化的监控展现要先加mybatis的驱动运行之后可以删除mybatis驱动不然.yml会变不成绿叶
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependency
/dependencies
3. 写YML
在resources下建application.yml设置端口80
server:port: 81
4. 主启动
在java下创建com.atguigu.springcloud.OrderMain80类
SpringBootApplication
public class OrderMain81 {public static void main(String[] args){SpringApplication.run(OrderMain81.class,args);}
}
5. 业务类
5.1 entities复制payment8001的
RestTemplate提供了多种便捷访问远程Http服务的方法是一种简单便捷的访问restful服务模板类是Spring提供的用于访问Rest服务的客户端模板工具集。 5.2 创建springcloud下的config包在包下创建ApplicationContextConfig类
Configuration
public class ApplicationContextConfig{Beanpublic RestTemplate getRestTemp(){return new RestTemplate();}
}
5.3 在controller包下创建OrderController类
RestController
Slf4j
public class OrderController{public static final String PAYMENT_URL http://localhost:8081;Resourceprivate RestTemplate restTemplate;PostMapping(/consumer/payment/create)public CommonResultPayment create(Payment payment){return restTemplate.postForObject(PAYMENT_URL/payment/create,payment,CommonResult.class);}GetMapping(/consumer/payment/get/{id})public CommonResultPayment getPayment(PathVariable(id) Long id){return restTemplate.getForObject(PAYMENT_URL/payment/get/id,CommonResult.class);}
} 但此时调用create方法会出现插入值为空的情况记得要在cloud-provider-payment8001的controller下的PaymentController类中加入RequestBody注解 RequestBody注解用于将HTTP请求的请求体部分映射到方法的参数上。
新版的Dashboard叫作services
4.5 重构
新建一个cloud-api-commons模块作为通用封装类 在模块下引入依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.1.0/version/dependency
dependencies 在模块的java目录下建com.atguigu.springcloud.entities包直接将entities粘贴在下面
点击右边的Maven选择刷新出现cloud-api-commons进入Lifecycle点击clean点击install即可。
删除掉原先的entities包
将下面依赖粘贴在删掉entities包的模块之下 dependencygroupIdcom.atguigu.springcloud/groupIdartifactIdcloud-api-commons/artifactIdversion${project.version}/version
/dependency
贰、初级
五、Eureka服务注册与发现
7001、7002模拟的是Eureka服务器81模拟消费者8081和8082模拟生产者。
5.1 基础知识 5.2 服务端安装
1. 建module
ArtifactIdcloud-eureka-server7001,com.atguigu.springcloud
2. 改POM
dependencies
!--eureka-server--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId
/deoendency
dependencygroupIdorg.atguigu.springcloud/groupIdartifactIdcloud-api-common/artifactIdversion${project.version}/version
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional
/dependency
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency
/dependencies
3. 写YML
在resources下创建application.yml
server:port: 7001
eureka:instance:hostname: localhost #eureka服务端实例名称client:#false表示不向注册中心注册自己register-with-eureka: false#false表示自己端就是注册中心我的职责就是维护服务实例不需要检索服务fetch-registry: falseservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4. 主启动
创建EurekaMain7001作为启动类
SpringBootApplication
EnableEurekaServer
public class EurekaMain7001{public static void main(String[] args){SpringApplication.run(EurekaMain7001.class,args);}
}
如果成功输入localhost:7001后出现下面字样 5.3 支付微服务8081入驻进eurekaServer
在8081的Pom中引入
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency
在application.yml文件中增加如下代码
eureka:client:#表示是否将自己注册进Eurekaserver默认为trueregister-with-eureka: true#是否从EurekaServer抓取已有的注册信息默认为true。单节点无所谓集群必须设置为true才能配合ribbon使用负载均衡。fetchRegistry: trueservice-url:defaultZone: http://localhost:7001/eureka
在启动类添加注解EnableEurekaClient
如果成功Instances区域会出现CLOUD-PAYMENT-SERVICE这一新的Instances 5.4 订单微服务81入驻进eurekaServer
在Pom中加入如下代码
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency
在YML中加入如下代码
eureka:client:register-with-eureka: truefetchRegistry: trueservice-url:defaultZone: http://localhost:7001/eureka 在启动类中加入如下代码EnableEurekaClient
如果成功出现如下2个 register-with-eureka为false表示不让入驻为true表示让入驻。
5.5 集群原理说明
Eureka Server服务注册将服务信息注册进服务中心。服务发现从注册中心上获取服务信息。实质存key服务名 取 value调用地址。
先启动eureka注册中心。启动服务提供者payment支付服务。支付服务启动后会把自身信息如服务地址以别名方式注册进eureka。消费者order服务在需要调用接口时使用服务别名去注册中心获取实际的RPC远程调用地址。消费者或者调用地址后底层实际是利用HttpClient技术实现远程调用。消费者获取服务地址后会缓存在本地jvm内存中默认每隔30秒更新一次服务调用地址。
Eureka具有高可用特点可搭建Eureka注册中心集群实现负载均衡容错故障。避免单点故障。互相注册相互守望。
5.6 集群环境构建
建Modulecloud-eureka-server7002
Pom直接复制7001
YML建application.yml
主启动类EurekaMain7002用7001的注解
修改配置C\Windows\System32\drivers\etc路径下的hosts文件。 修改7001的.yml修改hostname和defaultZone
server:port: 7001
eureka:instance:hostname: eureka7001.com #eureka服务端实例名称client:#false表示不向注册中心注册自己register-with-eureka: false#false表示自己端就是注册中心我的职责就是维护服务实例不需要检索服务fetch-registry: falseservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7002.com:7002/eureka/
修改7002的.yml文件
server:port: 7002
eureka:instance:hostname: eureka7002.com #eureka服务端实例名称client:#false表示不向注册中心注册自己register-with-eureka: false#false表示自己端就是注册中心我的职责就是维护服务实例不需要检索服务fetch-registry: falseservice-url:#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7001.com:7001/eureka/
输入eureka7002.com:7002127.0.0.1:7002和eureka7001.com:7001127.0.0.1能见到eureka首页
输入
locahost:7002能指向7001,locahost:7001能指向7002算是成功 5.7 订单支付两微服务注册进Eureka集群
YML在8081的eureka下添加
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka YML在81的eureka下添加
eureka:client:register-with-eureka: truefetchRegistry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
启动
先要启动EurekaServer7001/7002服务
再启动服务提供者provider8081
再启动消费者81
输入http://localhost:81/consumer/payment/get/31如果查询成功即可
测试 eureka7001.com:7001可以看到81和8081注册进入 eureka7002.com:7002同样也可以看到
5.8 支付微服务集群配置
建Module创建cloud-provider-payment8082
改Pom把8081粘贴入8082
写YML把8081的粘贴入8082改一个端口号
主启动建PaymentMain8082把8081的启动类复制过来把resource下的mapper包粘贴到8082把com包直接粘贴到8082。
改controller修改8001和8002加入如下内容
Value(${server.port})
private String serverPort;
return new CommonResult(200,插入数据库成功,serverPortserverPort,result);
return new CommonResult(200,查询成功,serverPortserverPort,payment);
启动顺序7001、7002、8081、8082、81
测试eureka7001.com:7001eureka7002.com:7002localhost:81/consumer/payment/get/31 发现bug订单服务访问地址是写死的。 此时会报错因为IDEA不知道是这个地址下的哪台服务器提供服务。
使用LoadBalanced注解赋予RestTemplate负载均衡的能力注解写在config包的ApplicationContextConfig下 此时访问localhost:81/consumer/payment/get/31端口号会在8081和8082之间来回切换 5.9 actuator微服务信息完善
加上instance: instance-id和prefer-ip-address: true访问路径显示ip地址 5.10 服务发现Discovery
在8081的controller的PaymentController类上修改
Slf4j
RestController
public class PaymentController {Resourceprivate DiscoveryClient discoveryClient;GetMapping(value/payment/discovery)public Object discovery(){ListString services discoveryClient.getServices();for(String element : services){log.info(*****element: element);}ListServiceInstance instances discoveryClient.getInstances(CLOUD-PAYMENT-SERVICE);for(ServiceInstance instance : instances){log.info(instance.getServiceId()\tinstance.getHost()\tinstance.getPort()\tinstance.getUri());}return instances;}
} 5. 11 Eureka自我保护理论知识 概括某时刻某一个微服务不可用了Eureka不会立刻清理依旧会对该微服务的信息进行保存。
为了防止EurekaClient可以正常运行但是与EurekaServer网络不通情况下EurekaServer不会立刻将EurekaClient服务器剔除。 5.12 禁止自我保护
在7001的yml文件中的eureka下加下列代码 server:#关闭自我保护机制保证不可用服务被及时踢除enable-self-preservation: falseeviction-interval-timer-in-ms: 2000 测试先看8081是否存在关闭8081看卡是否立刻删除。
Eureka停更说明 六、Zookeeper服务注册与发现
6.1 Zookeeper的安装
下载zookeeper-3.4.9下面是安装地址
https://archive.apache.org/dist/zookeeper/
在Linux虚拟机中创建/opt/module目录把zookeeper的gz压缩包放到该目录下。
然后解压该压缩包到该目录
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
然后修改配置
将/opt/module/zookeeper-3.4.10/conf这个路径下的zoo.sample.cfg修改为zoo.cfg
mv zoo_sample.cfg zoo.cfg
在/opt/module/zookeeper-3.4.10目录创建zkData文件夹
mkdir zkData
打开zoo.cfg文件修改dataDir路径
vim zoo.cfg
修改如下内容
dataDir/opt/module/zookeeper-3.4.10/zkData
启动Zookeeper服务
输入sudo /opt/module/zookeeper-3.4.9/bin/zkServer.sh start
进入Zookeeper
输入sudo /opt/module/zookeeper-3.4.9/bin/zkCli.sh
退出Zookeeper
输入quit
关闭Zookeeper服务
sudo /opt/module/zookeeper-3.4.9/bin/zkServer.sh stop
6.2 项目环境配置 在/opt/module/zookeeper-3.4.9/bin目录下输入
sudo systemctl stop firewalld 关闭防火墙。
sudo systemctl status firewalld检查防火墙是否关闭。
确保虚拟机能和windows ping通 建modulecloud-provider-payment8004
pom
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional
/dependency
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-zookeeper-discovery/artifactId
/dependency
YML
server:port: 8004
#服务别名 — — — — 注册zookeeper到注册中心名称
spring:application:name: cloud-provider-paymentcloud:zookeeper:connect-string: 192.168.182.157:2181 启动类
com.atguigu.springcloud.PaymentMain8004
SpringBootApplication
EnableDiscoveryClient
public class PaymentMain8004 {public static void main(String[] args) {SpringApplication.run(PaymentMain8004.class,args);}
}
服务类
springcloud下建controller包PaymentController
RestController
Slf4j
public class PaymentController {Value(${server.port})private String serverPort;RequestMapping(value/payment/zk)public String paymentzk(){return springcloud with zookeeper: serverPort\t UUID.randomUUID().toString();}
}
然后启动Zookeeper服务进入zookeeper
输入sudo /opt/module/zookeeper-3.4.9/bin/zkServer.sh start
输入sudo /opt/module/zookeeper-3.4.9/bin/zkCli.sh
输入get /zookeeper
版本冲突问题
dependency
!--添加zookeeper3.4.9版本--groupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.4.9/version
!--先排除自带的zookeeper3.5.3--exclusionsexclusiongroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactId/exclusion/exclusions
/dependency
然后点击启动。
测试localhost:8004/payment/zk如果每次刷新后面一串数字会变则成功 把json串赋值到tool.lu/json看得到信息则成功 6.3 临时还是持久节点
用的是临时的关闭8004一段时间zookeeper会踢掉。重新启动流水号会改变。
6.4 订单服务注册进zookeeper
modulecloud-consumerzk-order81。
POM复制8004见上节。
YML
server:port: 81
#服务别名 — — — — 注册zookeeper到注册中心名称
spring:application:name: cloud-consumer-ordercloud:#注册到zookeeper地址zookeeper:connect-string 192.168.182.157:2181
启动类
SpringBootApplication
EnableDiscoveryClient
public class OrderZKMain81 {public static void main(String[] args) {SpringApplication.run(OrderZKMain81.class,args);}
}
config:
Configuration
public class ApplicationContextConfig {Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
controller
RestController
Slf4j
public class OrderZKController {public static final String INVOKE_URLhttp://cloud-provider-payment;Resourceprivate RestTemplate restTemplate;GetMapping(value/consumer/payment/zk)public String paymentInfo(){String result restTemplate.getForObject(INVOKE_URL/payment/zk,String.class);return result;}
}
测试 七、Consul服务注册与发现
7.1 Consul简介 7.2 安装并运行Consul
下载地址
https://developer.hashicorp.com/consul/downloads 点击地址栏输入cmd输入consul --version再输入consul agent -dev
输入http://localhost:8500会进入界面看到勾勾 7.3 服务提供者注册进Consul
modulecloud-providerconsul-payment8006
pom
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-consul-discovery/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional
/dependency
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
yml
server:port: 8006spring:application:name: consul-provider-payment#consul注册中心地址
cloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name} 启动类
SpringBootApplication
EnableDiscoveryClient
public class PaymentMain8006 {public static void main(String[] args) {SpringApplication.run(PaymentMain8006.class,args);}
} 业务类复制8004稍加修改
RestController
Slf4j
public class PaymentController {Value(${server.port})private String serverPort;RequestMapping(value/payment/consul)public String paymentzk(){return springcloud with consul: serverPort\t UUID.randomUUID().toString();}
}
测试类启动 7.4 服务消费者注册进Consul
module: cloud-consumerconsul-order81
pom:
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-consul-discovery/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional
/dependency
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency yml
server:port: 80spring:application:name: cloud-consumer-order#consul注册中心地址
cloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}
主启动类 配置Bean Controller 验证测试启动 访问测试地址 7.5 三个注册中心异同点 CAP AP是Eureka是保证一致性。 不同网络分区数据同步失败为了保证可用性允许可以返回旧值所以是违背了一致性要求。 CP是Zookeeper和Consul是数据要一致不一致就挂报错。
八、Ribbon负载均衡服务调用
8.1 Ribbon入门介绍
1.先恢复环境EurekaMain7002PaymentMain8002OrderMain81PaymentMain8081EurekaMain7001。 基本介绍 能做什么 集中式 进程内 8.2 Ribbon的负载均衡和Rest调用