zjazn

SpringCloud介绍

img

image-20210407170707704

SpringClound

就是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。

功能:

服务注册与发现、服务调用、服务熔断、负载均衡、服务降级、服务消息队列、配置中心管理、服务网关、

服务监控、全链路追踪、自动化构建部署、服务定时任务调度操作

版本对应https://start.spring.io/actuator/info

Cloud升级与技术选型:

Cloud升级

父工程的创建

路线:

父工程的创建

创建

image-20210408193923573

编辑器编码

image-20210408193812398

开启注解

image-20210408193825474

选择java版本

image-20210408194328379

在编辑器中隐藏不想显示的文件后缀类型

image-20210408193906937

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.atguigu.springcloud</groupId>  <artifactId>cloud2020</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>pom</packaging><!--1-->  <name>Maven</name>  <!-- FIXME change it to the project\'s website -->  <url>http://maven.apache.org/</url>  <inceptionYear>2001</inceptionYear>  <distributionManagement>    <site>      <id>website</id>      <url>scp://webhost.company.com/www/website</url>    </site>  </distributionManagement>  <!--统一管理jar包版本-->  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <maven.compiler.source>1.8</maven.compiler.source>    <maven.compiler.target>1.8</maven.compiler.target>    <junit.version>4.12</junit.version>    <log4j.version>1.2.17</log4j.version>    <lombok.version>1.16.18</lombok.version>    <mysql.version>5.1.47</mysql.version>    <druid.version>1.1.16</druid.version>    <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>  </properties>  <!--子模块继承之后,提供作用:锁定版本+子module不用groupId和version-->  <dependencyManagement>    <dependencies>      <!--spring boot 2.2.2-->      <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-dependencies</artifactId>        <version>2.2.2.RELEASE</version>        <type>pom</type>        <scope>import</scope>      </dependency>      <!--spring cloud Hoxton.SR1-->      <dependency>        <groupId>org.springframework.cloud</groupId>        <artifactId>spring-cloud-dependencies</artifactId>        <version>Hoxton.SR1</version>        <type>pom</type>        <scope>import</scope>      </dependency>      <!--spring cloud alibaba 2.1.0.RELEASE-->      <dependency>        <groupId>com.alibaba.cloud</groupId>        <artifactId>spring-cloud-alibaba-dependencies</artifactId>        <version>2.1.0.RELEASE</version>        <type>pom</type>        <scope>import</scope>      </dependency>      <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>        <version>${mysql.version}</version>      </dependency>      <dependency>        <groupId>com.alibaba</groupId>        <artifactId>druid</artifactId>        <version>${druid.version}</version>      </dependency>      <dependency>        <groupId>org.mybatis.spring.boot</groupId>        <artifactId>mybatis-spring-boot-starter</artifactId>        <version>${mybatis.spring.boot.version}</version>      </dependency>      <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <version>${junit.version}</version>      </dependency>      <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>        <version>${lombok.version}</version>        <optional>true</optional>      </dependency>    </dependencies>  </dependencyManagement>  <build>    <plugins>      <plugin>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-maven-plugin</artifactId>        <configuration>          <fork>true</fork>          <addResources>true</addResources>        </configuration>      </plugin>    </plugins>  </build></project>

最终父工程:

image-20210408203151556

Model 创建与步骤

image-20210409214641100

建model

pom依赖

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>cloud2020</artifactId>        <groupId>com.atguigu.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloud-provider-payment8001</artifactId>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.mybatis.spring.boot</groupId>            <artifactId>mybatis-spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid-spring-boot-starter</artifactId>            <version>1.1.10</version>        </dependency>        <!--mysql-connector-java-->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-jdbc</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies></project>

写yml

server:  port: 8001  #服务端口号spring:  application:    name: cloud-provider-service  #服务名  datasource:    type: com.alibaba.druid.pool.DruidDataSource      #当前数据源操作类型    driver-class-name: org.gjt.mm.mysql.Driver        #mysql驱动包    url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding-utr-8&useSSL=false    username: root    password: 3333mybatis:  mapper-locations: classpath:mapper/*.xml  type-aliases-package: com.atguigu.springcloud.entities       #所有Entity别名类所在包

主启动类

package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class PaymentMain8001 {    public static void main(String[] args) {        SpringApplication.run(PaymentMain8001.class,args);    }}

业务类

建表sql
CREATE TABLE `payment`(	`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'ID\',	`serial` varchar(200) DEFAULT \'\',	PRIMARY KEY (`id`)) ENGING=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
entities
package com.atguigu.springcloud.entities;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data@AllArgsConstructor@NoArgsConstructorpublic class Payment implements Serializable { /*继承用于自动化部署*/    private Long id;    private String serial;}
//Json封装体CommentResult,传给前端,判断编码是否成功,成功才显示package com.atguigu.springcloud.entities;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class CommonResult<T> {    private Integer code;    private String message;    private T data;    public CommonResult(Integer code,String message) { //泛型:如果装的payment 返回payment,装的order 返回order        this(code,message,null);    }    //new CommonResult(200,\'成功\')。。?}
dao
package com.atguigu.springcloud.dao;import com.atguigu.springcloud.entities.Payment;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;@Mapperpublic interface PaymentDao {    int create(Payment payment);    Payment getPaymentById(@Param("id") Long id);}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.atguigu.springcloud.dao.PaymentDao">    <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id" >        insert into payment(serial) values (#{serial})    </insert>    <resultMap id="BaseResultMap" type="com.atguigu.springcloud.entities.Payment">        <id column="id" property="id" jdbcType="BIGINT" />        <result column="serial" property="serial" jdbcType="VARCHAR" />    </resultMap>    <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap" >        select * from payment where id=#{id}    </select></mapper>
service
package com.atguigu.springcloud.service;import com.atguigu.springcloud.entities.Payment;import org.apache.ibatis.annotations.Param;public interface PaymentService {    int create(Payment payment);    Payment getPaymentById(@Param("id") Long id);}
package com.atguigu.springcloud.service.impl;import com.atguigu.springcloud.dao.PaymentDao;import com.atguigu.springcloud.entities.Payment;import com.atguigu.springcloud.service.PaymentService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Servicepublic class PaymentServiceImpl implements PaymentService {    @Resource    private PaymentDao paymentDao;    public int create(Payment payment) {        return paymentDao.create(payment);    }    public Payment getPaymentById(Long id) {        return paymentDao.getPaymentById(id);    }}
controller
package com.atguigu.springcloud.controller;import com.atguigu.springcloud.entities.CommonResult;import com.atguigu.springcloud.entities.Payment;import com.atguigu.springcloud.service.PaymentService;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;@RestController@RequestMapping("/payment")@Slf4jpublic class PaymentController {    @Resource    private PaymentService paymentService;    //只传给前端CommonResult,不需要前端了解其他的组件    @PostMapping(value = "/create")    public CommonResult create(Payment payment) {        int result = paymentService.create(payment);        log.info("*****插入结果:"+result);        if(result > 0) {            return new CommonResult(200,"插入数据成功",result);        }else {            return new CommonResult(444,"插入数据失败",null);        }    }    @GetMapping(value = "/get/{id}")    public CommonResult getPaymentById(@PathVariable("id") Long id) {        Payment payment = paymentService.getPaymentById(id);        log.info("*****查询结果:"+payment);        if(payment != null) {            return new CommonResult(200,"查询成功",payment);        }else {            return new CommonResult(444,"没有对应记录,查询ID:"+id,null);        }    }}

devtools热部署

image-20210409214726625

模块

        <!--热部署-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>

父工程

  <!--热部署-->  <build>    <plugins>      <plugin>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-maven-plugin</artifactId>        <configuration>          <fork>true</fork>          <addResources>true</addResources>        </configuration>      </plugin>    </plugins>  </build>

IDEA设置

image-20210409214329373

ctrl+shift+alt+/

image-20210409214433230

image-20210409214413380

重启IDEA

消费者模块

image-20210410180546928

创建model

普通Maven

改pom

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>cloud2020</artifactId>        <groupId>com.atguigu.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloud-consumer-order80</artifactId>    <properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies></project>

写yml

server:  port: 86

主启动类

package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class OrderMain80 {    public static void main(String[] args) {        SpringApplication.run(OrderMain80.class,args);    }}

entities

package com.atguigu.springcloud.entities;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class CommonResult<T>{    private Integer code;    private String message;    private T data;    public CommonResult(Integer code,String message) {        this(code,message,null);    }}
package com.atguigu.springcloud.entities;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import sun.rmi.runtime.Log;@Data@AllArgsConstructor@NoArgsConstructorpublic class Payment {    private Log id;    private String serial;}

config

package com.atguigu.springcloud.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class ApplicationContextConfig {    @Bean    public RestTemplate getRestTemplate() {        return new RestTemplate();    }}

controller

package com.atguigu.springcloud.controller;import com.atguigu.springcloud.entities.CommonResult;import com.atguigu.springcloud.entities.Payment;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController@Slf4jpublic class OrderController {    private static final String PAYMENT_URL="http://localhost:8001";    @Resource    private RestTemplate restTemplate;    @GetMapping("/consumer/payment/create")    public CommonResult<Payment> create(Payment payment) {        return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);    }    @GetMapping("/consumer/payment/get/{id}")    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);    }}

image-20210410181056211

重构:

common模块

package com.atguigu.springcloud.entities;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Payment {    private Long id;    private String serial;}
package com.atguigu.springcloud.entities;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class CommonResult<T> {  //泛型:如果装的payment 返回payment,装的order 返回order    private Integer code;    private String message;    private T data;    public CommonResult(Integer code,String message){        this(code,message,null);    }}
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>springcloud2021</artifactId>        <groupId>com.atguigu</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloud-common</artifactId>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>cn.hutool</groupId>            <artifactId>hutool-all</artifactId>            <version>5.1.0</version>        </dependency>    </dependencies></project>

核心知识学习

Eureka

注册中心 Eureka

img

image-20210417182416549

改pom

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>springcloud2021</artifactId>        <groupId>com.atguigu</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloud-eureka-server7001</artifactId>    <properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>    </properties>    <dependencies>        <!--引入我的自己的模块-->        <dependency>            <groupId>com.atguigu</groupId>            <artifactId>cloud-common</artifactId>            <version>1.0-SNAPSHOT</version>        </dependency>        <!--eureka-server-->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>        </dependency>        <!--boot web actuator-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <!--一般通用配置-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <scope>runtime</scope>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>        </dependency>    </dependencies></project>

写yml

server:  port: 7001eureka:  instance:    hostname: eureka7001.com #eureka服务端的实例名称  client:    #false表示不向注册中心注册自己    register-with-eureka: false    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务    fetch-registry: false    service-url:      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址,相互注册      defaultZone: http://7002.cn.utools.club/eureka/

主启动

package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication//Eureka服务端@EnableEurekaServerpublic class EurekaMain7001 {    public static void main(String[] args) {        SpringApplication.run(EurekaMain7001.class,args);    }}

入住服务

        <!--eureka-client client入驻server -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>        </dependency>
server:  port: 8002spring:  application:    name: cloud-provider-service  datasource:    type: com.alibaba.druid.pool.DruidDataSource      #当前数据源操作类型    driver-class-name: org.gjt.mm.mysql.Driver        #mysql驱动包    url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false    username: root    password: 3333mybatis:  mapper-locations: classpath:mapper/*.xml  type-aliases-package: com.atguigu.springcloud.entities       #所有Entity别名类所在包#服务入驻eureka:  client:    #表示是否将自己注册进EurekaServer默认为true    register-with-eureka: true    fetch-registry: true    service-url:      defaultZone: https://7001.cn.utools.club/eureka,https://7002.cn.utools.club/eureka  instance:    instance-id: payment-8002    prefer-ip-address: true  #mouse hover时显示IP地址
@SpringBootApplication@EnableEurekaClientpublic class PaymentMain8002 {    public static void main(String[] args) {        SpringApplication.run(PaymentMain8002.class,args);    }}

集群

就是多注册几个。

RestTemplate负载均衡

package com.atguigu.springcloud.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class ApplicationContextConfig {    @Bean    @LoadBalanced  //赋于 负载均衡的能力    public RestTemplate getRestTemplate(){        return new RestTemplate();    }}
package com.atguigu.springcloud.controller;import com.atguigu.springcloud.entities.CommonResult;import com.atguigu.springcloud.entities.Payment;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController@Slf4jpublic class OrderController {    //    private static final String PAYMENT_URL="http://localhost:8001";    //通过在eureka上注册过的微服务名称调用    private static final String PAYMENT_URL = "http://CLOUD-PROVIDER-SERVICE";    @Resource    private RestTemplate restTemplate;    @GetMapping("/consumer/payment/create")    public CommonResult<Payment> create(Payment payment){        return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);    }    @GetMapping("/consumer/payment/get/{id}")    public CommonResult<Payment> getPayment(@PathVariable("id") Long id){        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);    }}

可选: mouse hover 显示ip

#服务入驻eureka:  client:    #表示是否将自己注册进EurekaServer默认为true    register-with-eureka: true    fetch-registry: true    service-url:      defaultZone: https://7001.cn.utools.club/eureka,https://7002.cn.utools.club/eureka  instance:    instance-id: payment-8002    prefer-ip-address: true  #mouse hover时显示IP地址

服务发现 Discovery

image-20210417182416549

注入与使用Discovery

//PaymentControllerpackage com.atguigu.springcloud.controller;import com.atguigu.springcloud.entities.CommonResult;import com.atguigu.springcloud.entities.Payment;import com.atguigu.springcloud.service.PaymentService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.client.ServiceInstance;import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import java.util.List;@RestController@Slf4jpublic class PaymentController {    @Resource    private PaymentService paymentService;    @Value("${server.port}")    private String serverPort;    @Resource    private DiscoveryClient discoveryClient;    //只传给前端CommonResult,不需要前端了解其他的组件    @PostMapping(value = "/payment/create")    public CommonResult create(@RequestBody Payment payment){        int result = paymentService.create(payment);        log.info("*****插入结果:"+result);        if(result > 0){            return new CommonResult(200,"插入数据成功,serverPort="+serverPort,result);        }else{            return new CommonResult(444,"插入数据失败",null);        }    }    @GetMapping(value = "/payment/get/{id}")    public CommonResult getPaymentById(@PathVariable("id") Long id){        Payment payment = paymentService.getPaymentById(id);        log.info("*****查询结果:"+payment);        if(payment != null){            return new CommonResult(200,"查询成功,serverPort="+serverPort,payment);        }else{            return new CommonResult(444,"没有对应记录,查询ID:"+id,null);        }    }    @GetMapping(value = "/payment/discovery")    public Object discovery() {        List<String> services = discoveryClient.getServices();        for (String element :services) {            log.info("*********element:"+element);        }        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PROVIDER-SERVICE");        for (ServiceInstance instance : instances) {            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());        }        return this.discoveryClient;    }}

效果

image-20210417175651591

image-20210417175612544

禁止自我保护

--服务端

server:  port: 7001eureka:  instance:    hostname: eureka7001.com #eureka服务端的实例名称  client:    #false表示不向注册中心注册自己    register-with-eureka: false    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务    fetch-registry: false    service-url:      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址      defaultZone: http://7002.cn.utools.club/eureka/  # ******下面的代码用来关闭Eureka服务端的自我保护机制******  server:    # 关闭自我保护机制,保证不可用的服务被及时剔除    enable-self-preservation: false    # 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒    eviction-interval-timer-in-ms: 2000

客户端

server:  port: 8002spring:  application:    name: cloud-provider-service  datasource:    type: com.alibaba.druid.pool.DruidDataSource      #当前数据源操作类型    driver-class-name: org.gjt.mm.mysql.Driver        #mysql驱动包    url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false    username: root    password: 3333mybatis:  mapper-locations: classpath:mapper/*.xml  type-aliases-package: com.atguigu.springcloud.entities       #所有Entity别名类所在包#服务入驻eureka:  client:    #表示是否将自己注册进EurekaServer默认为true    register-with-eureka: true    fetch-registry: true    service-url:      defaultZone: https://7001.cn.utools.club/eureka,https://7002.cn.utools.club/eureka  instance:    instance-id: payment-8002    prefer-ip-address: true  #mouse hover时显示IP地址    #Eureka客户端向服务器端发送心跳的时间间隔 ,单位为秒(默认是30秒)    lease-renewal-interval-in-seconds: 1    #Eureka 服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时剔除服务    lease-expiration-duration-in-seconds: 2

效果

zookeeper

zookeeper注册中心

概览:

Linux端环境:就是在Linux上启用zookeeper,与查看上zookeeper注册的服务。

步骤说明:因为zookeeper要用到jdk,所以我们需要在linux上安装jdk,然后再配置使用zookeeper.也就是先配置jdk再配置zookeeper,才能使用zookeeper。

效果:我们使用Linux的ip地址与一般固定的2181端口用于注册中心给模块注册。然后我们用命令来查看在上面的服务列表可以看到我们注册的服务-> 模块上的具体信息, 这不懂??


全局使用:解压命令:tar -zxvf 压缩包.tar.gz

**1、java-jdk **
【下载jdk1.8】((我选择的是jdk-8u281-linux-x64.tar.gz)):
https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html
【配置环境变量】
export JAVA_HOME=/opt/jdk1.8.0_281
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH

2、zookeeper

(下载: http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/?C=S;O=A)

【修改zookeeper包配置】

进入包根目录,mkdir data

进入包下的conf ,将 zoo_sample.cfg 复制一份并命名为 zoo.cfg

​ cp zoo_sample.cfg zoo.cfg

编辑 vi zoo.cfg 修改dataDir为你的包路径下的data,这不会??

【环境变量】
打开vim /etc/profile,在最后加入
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.9
export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

【设置zookeeper开机自启】
1)进入/etc/init.d 然后 vi zookeeper,内容是:

#!/bin/sh#chkconfig: 2345 80 90#description:auto_run#description:zookeeper#processname:zookeeperZK_PATH=/opt/zookeeper-3.4.9export JAVA_HOME=/opt/jdk1.8.0_281case $1 in         start) sh  $ZK_PATH/bin/zkServer.sh start;;         stop)  sh  $ZK_PATH/bin/zkServer.sh stop;;         status) sh  $ZK_PATH/bin/zkServer.sh status;;         restart) sh $ZK_PATH/bin/zkServer.sh restart;;         *)  echo "require start|stop|status|restart"  ;;esac

​ 2)注册为服务(就可以使用service来操作zookeeper了)
chkconfig --add zookeeper

​ 3)添加操作zookeeper文件权限,否则4会提示没有权限
chmod a+xwr zookeeper #如果没有权限

​ 4)然后以服务的方式启动zookeeper
service zookeeper start

【关闭防火墙 !!】
[rooMode: standalone
t@localhost bin]# systemctl stop firewalld #关闭防火墙
[root@localhost bin]# systemctl status firewalld #查看防火墙是否关闭
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since 一 2021-04-19 21:01:41 PDT; 13s ago
...

【开启zookeeper注册中心功能】
service zookeeper start #启动服务
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 2765.

service zookeeper status #查看状态
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: standalone

【查看注册情况】
zookeeper>bin执行命令:
[root@localhost opt]# cd zookeeper-3.4.9/bin #1、进入zookeeper的bin目录下
[root@localhost bin]# ./zk
zkCleanup.sh zkCli.cmd zkCli.sh zkEnv.cmd zkEnv.sh zkServer.cmd zkServer.sh
[root@localhost bin]# ./zkCli.sh #2、执行zkCli.sh
Connecting to localhost:2181
2021-04-19 21:39:27,413 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2021-04-19 21:39:27,423 [myid:] - INFO [main:Environment@100] - Client environment:host.name=localhost
2021-04-19 21:39:27,423 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_282
....
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] #3、说明代表成功

[zk: localhost:2181(CONNECTED) 9] ls / #查看

[services, zookeeper]
[zk: localhost:2181(CONNECTED) 10] ls /services #查看服务
[cloud-provider-payment, cloud-provider-payment-test] #哪些服务注册在zookeeper上了
[zk: localhost:2181(CONNECTED) 11] ls /services/cloud-provider-payment #查看服务名下有哪些模块
[ec071f77-3477-4be1-a625-ab5a015f6719]
[zk: localhost:2181(CONNECTED) 13] get /services/cloud-provider-payment/ec071f77-3477-4be1-a625-ab5a015f6719 #查看模块具体信息(下面json字符串)
{"name":"cloud-provider-payment","id":"ec071f77-3477-4be1-a625-ab5a015f6719","address":"DESKTOP-HPKMNTJ","port":8004,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","name":"cloud-provider-payment","metadata":{}},"registrationTimeUTC":1618903366771,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"

分类:

技术点:

相关文章:

  • 2022-01-27
  • 2021-06-05
  • 2022-01-17
  • 2021-06-24
  • 2021-09-18
  • 2021-10-19
  • 2021-12-17
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-12-19
  • 2022-12-23
  • 2021-06-15
  • 2021-05-10
  • 2022-01-07
  • 2021-12-14
相关资源
相似解决方案