参考:尚硅谷-阳哥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。