springcloud入门---注册中心使用

参考:尚硅谷-阳哥springcloud第二季

 

1.springboot与springcloud的版本选择

springboot:2.2.2

springcould:H版本  Hoxton.SRL

该版本的设置,放置在父类maven的Pom.xml中

部分代码:

 <groupId>com.myProject.springcloud</groupId>
  <artifactId>mycloud</artifactId>
  <version>1.0-SNAPSHOT</version>
    <modules>
        <module>cloud_provider_payment8001</module>
      <module>cloud_api_commons</module>
        <module>cloud_comsumer_order80</module>
        <module>cloud-eureka-server7001</module>
        <module>cloud-eureka-server7002</module>
        <module>cloud-provider8002</module>
      <module>cloud-comsumer80</module>
    </modules>
    <packaging>pom</packaging>

  <name>Maven</name>
  <!-- FIXME change it to the project's website -->
  <url>http://maven.apache.org/</url>
  <inceptionYear>2001</inceptionYear>

  <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.18.10</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.verison>1.1.16</druid.verison>
    <mybatis.spring.boot.verison>1.3.0</mybatis.spring.boot.verison>
  </properties>
<dependencyManagement>
  <dependencies>
    <!-- springboot -->
    <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.SR!-->
    <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 -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!-- mysql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
  </dependency>
    <!-- Druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>${druid.verison}</version>
    </dependency>
    <!-- mybatis-springboot整合 -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>${mybatis.spring.boot.verison}</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
    </dependency>
    <!--junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
    </dependency>
    <!-- log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

2.创建消费者和生产者,实现微服务基本结构

1.生产者:cloud-provider 

端口设置8001

该生产者的逻辑简单,遵循mvc架构,通过controller层-service层-dao层,实现基本的业务逻辑,我们这里就简单的从数据库Mysql中查出一条数据即可。

重点是maven的配置:application.yml+pom.xml的配置。

server:
  port: 8001
spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource  #数据源类型
    driver-class-name: org.gjt.mm.mysql.Driver    #mysql驱动包
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.cloud.entity  #实体类所在包
logging:
  pattern:
    console: "[%thread] %-5level %logger{36} - %msg%n"

1.设置端口号

2.设置mysql的信息

3.mybatis的信息

4.日志信息

后续还要添加注册中心eureka的信息,此处暂时不添加。

pom.xml

<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>
    <!-- orm 框架 数据库连接池 -->
    <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>
    </dependency>
    <!-- mysql 链接 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!--eureka-client-->
  <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- 代码生成 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

1.基本的springboot-starter:web 还有一个监控工具:actuator;

2.mysql相关的,jdbc,连接池Druid,mybatis配置

3.此处导入了注册中心:eureka的包,

4.代码生成的lombok工具

 

环境搭建好之后,开始书写代码:

1.核心配置类:application,与平时没有区别

2.controller:与平时没有区别,简单的导入service,然后设置RequestMapping路径,返回json结果即可。

3.service同样,设置接口,然后实现类,调用dao接口,完全任务。

4.dao层,直接把简单的sql语句放到方法上面,使用注解@select

@RestController
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @PostMapping("/payment/create")
    public CommonResult<Payment> create(@RequestBody Payment payment){
        int result=paymentService.create(payment);
        log.info("---------插入结果:"+result);
        if(result>0){
            return new CommonResult(200,"插入数据成功",result);
        }else{
            return new CommonResult(444,"插入数据失败",null);
        }
    }
}

到此,我们的生产者部署完成,可以直接启动通过controller中的RequestMapping路径进行访问,后续进行消费者的创建。

 

2.消费者:cloud-consumer

端口设置:80

同理还是application.yml配置

与cloud-privoder相同,只不过对于一些不需要的,不用设置,修改端口号为80,由于没有涉及dao层,所以不需要导报,也不需要配置。只需要导入最基本的三个包:web,actuator,eureka

server:
  port: 80
spring:
  application:
    name: cloud-consumer-order80
logging:
  pattern:
    console: "[%thread] %-5level %logger{36} - %msg%n"

Pom.xml

<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>
<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

然后直接书写controller层,springcloud的微服务调用与Dubbo调用不同的点在与,cloud使用的http进行通信,而dubbo底层使用netty的socket进行通信,所以dubbo自己要进行ip地址连接,而cloud发出restful请求访问即可。使用RestTemplate就可以代理发出http请求。

当然,为了方便RestTemplate的自动注入使用,需要在配置类中,将RestTemplate注入到spring容器中:

@Configuration
public class ApplicationContextConfig {
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

然后controller借用它访问生产者的业务:

@RestController
public class OrderController {
    public 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);
    }
}

两个服务启动起来,我们就可以通过consumer访问privoder提供的服务了。 逻辑其实很简单。

 

但是如果生产者变多,同一个服务有多个生产者提供,这个时候,如果consumer还是直接通过ip进行服务访问,那么在代码上面就显得很繁琐,而且对于同一个业务的请求也变得固定,不支持高可用,所以需要介入注册中心,通过注册中心来发现更好的服务提供者,中间还可以加上负载均衡。 

 

3.引入eureka

这里就引入了eureka注册中心,使用也比较简单。

1.首先是创建eureka服务端,把自己标记为server,提供服务。

导入包

<dependencies>
    <!--eureka-server-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    <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>
</dependencies>

与consumer同样也是三个jar包,但是这里注意,consumer和privoder使用的都是eureka-client,而eureka使用的是eureka-server,这里导入的包是有区别的!

然后!配置eureka的yml信息!

主要有三个信息:

register-with-eureka: 表示是否将自己注册到eureka中

fetch-registry: 表示是否从eureka中拉取信息

service-url:defaultZone:表示连接的eureka服务器地址。

eureka:application.yml

对于eureka服务器来说,它是不需要注册,也不需要拉取信息的,所以两个都可以设置为false。但是如果是集群模式,那么也需要把自己注册到目标eureka中。

server:
  port: 7001
eureka:
  instance:
    hostname: localhost # eureka服务端实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    fetch-registry: false

而且在application.java 核心配置类中:开启@EnableEurekaServer注解。

此时,eureka服务器就创建完全了,三步骤:1.pom.xml导入包。2.yml中配置信息。3.配置类中开启注解。

 

consumer消费中配置,由于之前我们已经在pom中导入了eureka-client的包,这里就不叙述了,直接在yml中配置上述的三个信息:

eureka:
  client:
    register-with-eureka: false
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/

注意两个true,false的选择。

然后在配置类中开启@EnableEurekaClient注解。

对于privoder同样如此,只是需要把自己注册到eureka服务器中。

 

开启三个应用,就可以正常工作了。!

对于之前consumer需要通过privoder的ip地址进行访问,现在我们只需要通过privoder在yml中配置的name信息就可以直接访问了!而且相同业务的privoder可以有相同的name。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值